C программа - проверяющий, являются ли два перечисления в синхронизации во время компиляции

C++ имеет шаблоны. Java имеет дженерики, которые выглядят вид вида подобных шаблонов C++, но они очень, очень отличающиеся.

Шаблонная работа, поскольку имя подразумевает путем обеспечения компилятора (ожидают его...), шаблон, который это может использовать для генерации безопасного с точки зрения типов кода путем заполнения шаблонных параметров.

Дженерики, поскольку я понимаю их, работа наоборот: параметры типа используются компилятором, чтобы проверить, что код с помощью них безопасен с точки зрения типов, но получающийся код сгенерирован без типов вообще.

Думают о шаблонах C++ как действительно хороший макро-система и дженерики Java как инструмент для того, чтобы автоматически генерировать преобразования типа.

 

5
задан Jonathan Leffler 29 July 2009 в 03:55
поделиться

6 ответов

Заканчивайте каждое из перечислений известным перечислением, например как LAST_ENUM_1 и LAST_ENUM_2. Используйте #if в файле, который имеет доступ к обоим файлам заголовков для сравнения.

#if LAST_ENUM_1 != LAST_ENUM_2
   #error Enums have different sizes
#endif
5
ответ дан 18 December 2019 в 09:52
поделиться

Мне действительно нравятся другие ответы больше, чем тот, который я предлагаю сейчас ...

Если все другие решения не работают для вас, напишите простой скрипт Perl, который проверяет, такие же, и убедитесь, что скрипт perl вызывается из вашего make-файла. Это решит вашу проблему, но постарайтесь избежать, если сможете.

1
ответ дан 18 December 2019 в 09:52
поделиться

используйте как

enum EMyEnum
{
    JOE   = 0,
    BLACK = 1,
    WHITE = 2,

    END_OF_ENUM = 3
}

, если вы используете такой формат, возможно, вы справитесь со всем проще

0
ответ дан 18 December 2019 в 09:52
поделиться

Имена, используемые в перечислениях, должны быть однозначными, поэтому вы возникнет проблема: либо компилятор имеет доступ к обоим определениям, тогда перечисления не могут быть идентичными из-за проблемы с именем, либо компилятор имеет доступ только к одному определению за раз, тогда ему не с чем проверять.

Даже количество элементов (предложенное Робертом) не может быть проверено во время компиляции (препроцессор ничего не знает о перечислениях). Если у вас действительно не может быть одного общего файла заголовка, проще всего будет проверить время выполнения в начале вашего приложения.

t быть идентичным из-за проблемы с именем или компилятор имеет доступ только к одному определению за раз, тогда ему нечего проверять.

Даже количество элементов (предложенное Робертом) не может быть проверено во время компиляции (препроцессор ничего не знает о перечислениях). Если у вас действительно не может быть одного общего файла заголовка, проще всего будет проверить время выполнения в начале вашего приложения.

t быть идентичным из-за проблемы с именем или компилятор имеет доступ только к одному определению за раз, тогда ему нечего проверять.

Даже количество элементов (предложенное Робертом) не может быть проверено во время компиляции (препроцессор ничего не знает о перечислениях). Если у вас действительно не может быть одного общего файла заголовка, проще всего будет проверить время выполнения в начале вашего приложения.

0
ответ дан 18 December 2019 в 09:52
поделиться

Поскольку компилятор просматривает один исходный файл (единица трансляции, TU) за раз, у него нет возможности пожаловаться на несоответствие между текущим TU и некоторым другим TU, что он не смотрит.

Вам нужно исправить ситуацию, чтобы у вас была одна копия определения перечисления, используемого обеими программами, - чтобы она принадлежала заголовку, который включается обеими.Практически все остальное слишком подвержено ошибкам для удобства.

0
ответ дан 18 December 2019 в 09:52
поделиться

Почему вы не помещаете это объявление в один файл заголовка, а затем не включаете его в два необходимых места?

11
ответ дан 18 December 2019 в 09:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: