typedef enum BeNeLux
{
BELGIUM,
NETHERLANDS,
LUXEMBURG
} _ASSOCIATIONS_ BeNeLux;
Когда я пытаюсь скомпилировать это с Компилятором C++, я получаю ошибки, но это, кажется, хорошо работает с компилятором C. Таким образом, вот вопрос. Действительно ли возможно упаковать перечисление в C++, или кто-то может видеть, почему я получил бы ошибку?
Ошибка:
"точка с запятой, отсутствующая после объявления Бенилюкса".
Я знаю после проверки и перепроверки, что определенно существует точка с запятой там, и в любых местах, требуемых в остальной части кода.
Приложение:
_PACKAGE_
был просто пример. Я переименовываю его.
_ASSOCIATIONS_
не тип Бенилюкса:
#define _ASSOCIATIONS_ __attribute__((packed))
Код является iffed, но только удостоверяться это - GNU C/C++.
#if defined (__GNUC__)
#define _ASSOCIATIONS_ __attribute__((packed))
#else
#define _ASSOCIATIONS_
Это вызвало бы проблемы? Я думал (GNUC), работавший и для C и для C++
Приложение 2:
Я даже попробовал
#ifdef __cplusplus
extern "C" {
#endif
typedef enum BeNeLux
{
BELGIUM,
NETHERLANDS,
LUXEMBURG
} _ASSOCIATIONS_ BeNeLux;
#ifdef __cplusplus
}
#endif
Никакая радость. Кто-либо?
Примечание: - fshort-перечисления не возможность; поиск программного решения.
Я не думаю, что есть что-то, что делает точно то, что вы хотите здесь. Я предполагаю, что вы пытаетесь создать тип, который является наименьшим типом для диапазона перечисления.
Если вам нужен такой тип управления, я бы порекомендовал что-то вроде этого:
typedef unsigned char BeNeLux;
static const BeNeLux BELGIUM = 0;
static const BeNeLux NETHERLANDS = 1;
static const BeNeLux LUXEMBURG = 2;
не так красиво и, возможно, немного менее безопасно для типов. Но дает нужный эффект. sizeof(BeNeLux) == 1
и у вас есть именованная константа для всех значений в диапазоне. Хороший компилятор даже не будет выделять переменную для static const
целочисленных значений до тех пор, пока вы никогда не попытаетесь использовать ее адрес.
В C ++ вам не требуется typedef
. Просто начните с перечисления BeNeLux
. Также возможно (я не могу вспомнить), что объявление типа и переменной с одним и тем же идентификатором может быть незаконным на одном из языков.
Я полагаю вы используете GCC и G ++. Для меня код отлично компилируется с любым из них. Было бы довольно удивительно, если бы такая функция исчезла при включении C ++ в каком-либо конкретном компиляторе.
Убедитесь, что ваш #define
не предназначен для кода C ++ #if
, например #ifndef __cplusplus
.
Попробуйте g ++ -E
, чтобы увидеть выходные данные препроцессора и убедиться, что появляется #define
.
Кроме того, даже для макросов препроцессора имена, начинающиеся с подчеркивания и заглавной буквы или два символа подчеркивания, зарезервированы для компилятора и библиотеки. Если у вас должен быть макрос, лучшим названием для него может быть PACKED
.
enum BeNeLux
{
BELGIUM,
NETHERLANDS,
LUXEMBURG
};
Это то, что ожидается от кода C ++.
Настоящих прорывов здесь нет. Я просто изменил порядок вещей в надежде, что ты
компилятор хотел бы лучше. У меня не было вашей версии gcc или g ++, поэтому я не мог протестировать их. Я запускал его через версии 3.4.5 gcc и g ++ (специальный mingw), которые оба предупреждали , что атрибут «упакованный» игнорируется
при заказе, как ваш код, но не жаловался на мой.
#ifdef __GNUC__
#define attribute(x) __attribute__((x));
#else
#define attribute(x)
#endif
#ifdef __cplusplus
extern "C" {
#endif
enum BeNeLux
{
BELGIUM,
NETHERLANDS,
LUXEMBURG
} attribute(packed);
// I declared attribute to look like a f() so that it would not look like I was
// declaring a variable here.
#ifndef __cplusplus
typedef enum BeNeLux BeNeLux; // the typedef is separated into a separate stmt
#else
}
#endif
#if defined (__GNUC__)
# if defined (__cplusplus)
# define ENUM enum
# else
# define ENUM typedef enum
# endif
# if defined (__cplusplus)
# define _ASSOCIATIONS_(X) __attribute__((packed))
# else
# define _ASSOCIATIONS_(X) __attribute__((packed)) X
# endif
#else
# if defined (__cplusplus)
# define _ASSOCIATIONS_(X)
# else
# define _ASSOCIATIONS_(X) X
# endif
#endif
ENUM BeNeLux {
BELGIUM,
NETHERLANDS,
LUXEMBURG
} _ASSOCIATIONS_ (BeNeLux);
Еще один фрагмент. см. новый #define ENUM
#if defined (__GNUC__)
# if defined (__cplusplus)
# define _ASSOCIATIONS_(X) __attribute__((packed))
# else
# define _ASSOCIATIONS_(X) __attribute__((packed)) X
# endif
#else
# if defined (__cplusplus)
# define _ASSOCIATIONS_(X)
# else
# define _ASSOCIATIONS_(X) X
# endif
#endif
typdef enum BeNeLux {
BELGIUM,
NETHERLANDS,
LUXEMBURG
} _ASSOCIATIONS_ (BeNeLux);
Это похоже на компиляцию в моем g ++ (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu4)