C++, упаковывающий перечисление определения типа

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-перечисления не возможность; поиск программного решения.

5
задан Sagar 25 May 2010 в 15:32
поделиться

7 ответов

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

Если вам нужен такой тип управления, я бы порекомендовал что-то вроде этого:

typedef unsigned char BeNeLux;
static const BeNeLux BELGIUM = 0;
static const BeNeLux NETHERLANDS = 1;
static const BeNeLux LUXEMBURG = 2;

не так красиво и, возможно, немного менее безопасно для типов. Но дает нужный эффект. sizeof(BeNeLux) == 1 и у вас есть именованная константа для всех значений в диапазоне. Хороший компилятор даже не будет выделять переменную для static const целочисленных значений до тех пор, пока вы никогда не попытаетесь использовать ее адрес.

1
ответ дан 15 December 2019 в 00:53
поделиться

В C ++ вам не требуется typedef . Просто начните с перечисления BeNeLux . Также возможно (я не могу вспомнить), что объявление типа и переменной с одним и тем же идентификатором может быть незаконным на одном из языков.

0
ответ дан 15 December 2019 в 00:53
поделиться

Я полагаю вы используете GCC и G ++. Для меня код отлично компилируется с любым из них. Было бы довольно удивительно, если бы такая функция исчезла при включении C ++ в каком-либо конкретном компиляторе.

Убедитесь, что ваш #define не предназначен для кода C ++ #if , например #ifndef __cplusplus .

Попробуйте g ++ -E , чтобы увидеть выходные данные препроцессора и убедиться, что появляется #define .

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

0
ответ дан 15 December 2019 в 00:53
поделиться
enum BeNeLux
{
   BELGIUM,
   NETHERLANDS,
   LUXEMBURG
};

Это то, что ожидается от кода C ++.

0
ответ дан 15 December 2019 в 00:53
поделиться

Настоящих прорывов здесь нет. Я просто изменил порядок вещей в надежде, что ты компилятор хотел бы лучше. У меня не было вашей версии 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
1
ответ дан 15 December 2019 в 00:53
поделиться
#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

0
ответ дан 15 December 2019 в 00:53
поделиться
#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)

2
ответ дан 15 December 2019 в 00:53
поделиться