В C enumконстанта имеет тип int. В C ++ это перечислимый тип.
enum en_e{
en_e_foo,
en_e_bar=UINT64_MAX,
};
В C это нарушение ограничения , требующее диагностики ( при UINT64_MAX превышении INT_MAX, что очень вероятно). Компилятор AC может полностью отклонить программу или вывести предупреждение, а затем сгенерировать исполняемый файл, поведение которого не определено. (Не совсем ясно, что программа, которая нарушает ограничение, обязательно имеет неопределенное поведение, но в этом случае стандарт не говорит, каково это поведение, поэтому это все еще неопределенное поведение.)
gcc 6.2 об этом не предупреждает. лязг делает. Это ошибка в gcc; он неправильно подавляет некоторые диагностические сообщения при использовании макросов из стандартных заголовков. Спасибо Гжегожу Шпетковски за обнаружение отчета об ошибке: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71613
В C ++ каждый тип перечисления имеет базовый тип , который представляет собой некоторый целочисленный тип (не обязательно int). Этот базовый тип должен иметь возможность представлять все постоянные значения. Таким образом, в этом случае оба типа en_e_fooи en_e_barимеют en_eширину не менее 64 бита, даже если они intуже.