C++ имеет шаблоны. Java имеет дженерики, которые выглядят вид вида подобных шаблонов C++, но они очень, очень отличающиеся.
Шаблонная работа, поскольку имя подразумевает путем обеспечения компилятора (ожидают его...), шаблон, который это может использовать для генерации безопасного с точки зрения типов кода путем заполнения шаблонных параметров.
Дженерики, поскольку я понимаю их, работа наоборот: параметры типа используются компилятором, чтобы проверить, что код с помощью них безопасен с точки зрения типов, но получающийся код сгенерирован без типов вообще.
Думают о шаблонах C++ как действительно хороший макро-система и дженерики Java как инструмент для того, чтобы автоматически генерировать преобразования типа.
Заканчивайте каждое из перечислений известным перечислением, например как LAST_ENUM_1 и LAST_ENUM_2. Используйте #if в файле, который имеет доступ к обоим файлам заголовков для сравнения.
#if LAST_ENUM_1 != LAST_ENUM_2
#error Enums have different sizes
#endif
Мне действительно нравятся другие ответы больше, чем тот, который я предлагаю сейчас ...
Если все другие решения не работают для вас, напишите простой скрипт Perl, который проверяет, такие же, и убедитесь, что скрипт perl вызывается из вашего make-файла. Это решит вашу проблему, но постарайтесь избежать, если сможете.
используйте как
enum EMyEnum
{
JOE = 0,
BLACK = 1,
WHITE = 2,
END_OF_ENUM = 3
}
, если вы используете такой формат, возможно, вы справитесь со всем проще
Имена, используемые в перечислениях, должны быть однозначными, поэтому вы возникнет проблема: либо компилятор имеет доступ к обоим определениям, тогда перечисления не могут быть идентичными из-за проблемы с именем, либо компилятор имеет доступ только к одному определению за раз, тогда ему не с чем проверять.
Даже количество элементов (предложенное Робертом) не может быть проверено во время компиляции (препроцессор ничего не знает о перечислениях). Если у вас действительно не может быть одного общего файла заголовка, проще всего будет проверить время выполнения в начале вашего приложения.
t быть идентичным из-за проблемы с именем или компилятор имеет доступ только к одному определению за раз, тогда ему нечего проверять.Даже количество элементов (предложенное Робертом) не может быть проверено во время компиляции (препроцессор ничего не знает о перечислениях). Если у вас действительно не может быть одного общего файла заголовка, проще всего будет проверить время выполнения в начале вашего приложения.
t быть идентичным из-за проблемы с именем или компилятор имеет доступ только к одному определению за раз, тогда ему нечего проверять.Даже количество элементов (предложенное Робертом) не может быть проверено во время компиляции (препроцессор ничего не знает о перечислениях). Если у вас действительно не может быть одного общего файла заголовка, проще всего будет проверить время выполнения в начале вашего приложения.
Поскольку компилятор просматривает один исходный файл (единица трансляции, TU) за раз, у него нет возможности пожаловаться на несоответствие между текущим TU и некоторым другим TU, что он не смотрит.
Вам нужно исправить ситуацию, чтобы у вас была одна копия определения перечисления, используемого обеими программами, - чтобы она принадлежала заголовку, который включается обеими.Практически все остальное слишком подвержено ошибкам для удобства.
Почему вы не помещаете это объявление в один файл заголовка, а затем не включаете его в два необходимых места?