Frage

typedef enum BeNeLux
{
   BELGIUM,
   NETHERLANDS,
   LUXEMBURG
} _ASSOCIATIONS_ BeNeLux;

Wenn ich versuche, dies zu kompilieren mit C ++ Compiler, erhalte ich Fehler, aber es scheint zu funktionieren mit einem C-Compiler. Also hier ist die Frage. Ist es möglich, eine Enumeration in C ++, oder kann jemand sehen packen, warum ich den Fehler bekommen würde?

Der Fehler ist:

„Semikolon nach Erklärung BeNeLux fehlt“.

Ich weiß, nach Überprüfung und erneute Überprüfung, dass es auf jeden Fall ein Semikolon ist, und in irgendwelchen im Rest des Codes erforderlichen Stellen.

Nachtrag:

_PACKAGE_ war nur ein Beispiel. Ich umbenennen.

_ASSOCIATIONS_ ist nicht eine Art von BeNeLux:

#define _ASSOCIATIONS_ __attribute__((packed))

Der Code wird iffed, aber nur, um sicherzustellen, ist es GNU C / C ++.

#if defined (__GNUC__) 
#define _ASSOCIATIONS_ __attribute__((packed))
#else
#define _ASSOCIATIONS_

würde dies zu Problemen führen? Ich dachte, ( GNUC ) sowohl für C und C ++ gearbeitet

Nachtrag 2:

Ich habe sogar versucht

#ifdef __cplusplus
extern "C" {
#endif

    typedef enum BeNeLux
    {
       BELGIUM,
       NETHERLANDS,
       LUXEMBURG
    } _ASSOCIATIONS_ BeNeLux;

#ifdef __cplusplus
}
#endif

Freude Nr. Anyone?

Hinweis: -fshort-Aufzählungen ist keine Möglichkeit; Suche eine programmatische Lösung.

War es hilfreich?

Lösung

Ich glaube nicht, dass es etwas ist, das tut genau , was Sie hier wollen. Ich nehme an, Sie versuchen, eine Art zu schaffen, die die kleinste Art für die Reichweite des Enum ist.

Wenn Sie diese Art der Steuerung benötigen, würde ich so etwas wie dies empfehlen:

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

nicht ganz so hübsch und vielleicht etwas weniger Art sicher. Aber hat die Wirkung, die Sie wollen. sizeof(BeNeLux) == 1 und Sie haben eine benannte Konstante für alle Werte im Bereich. Ein guter Compiler wird nicht einmal eine Variable für static const ganzzahlige Werte zuzuordnen, solange Sie nie die Adresse zu nutzen versuchen.

Andere Tipps

#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);

Dies scheint in meinem g++ (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu4)

zu kompilieren

Es gibt keinen wirklichen Durchbruch hier. I neu geordnet Dinge nur in der Hoffnung, dass Ihre Compiler wäre es besser gefällt. Ich habe nicht Ihre Version von gcc oder g ++, so konnte ich nicht Test mit denen. Ich habe es bis Version 3.4.5 gcc und g ++ (mingw special), die beide gewarnt 'packed' attribute ignored wenn wie Ihr Code bestellt laufen, aber nicht über mein beschwerten.

#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

In C ++, Sie brauchen nicht auf die typedef. Nur mit enum BeNeLux starten. Es ist auch möglich (ich kann nie erinnern), dass eine Art und eine Variable mit dem gleichen Bezeichner deklarieren kann in einen der Sprachen nicht legal sein.

enum BeNeLux
{
   BELGIUM,
   NETHERLANDS,
   LUXEMBURG
};

Dies ist, was von C ++ Code zu erwarten ist.

Ich nehme an, Sie GCC und G verwenden ++. Der Code kompiliert fein mit entweder, für mich. Es wäre eher überraschend, ein solches Feature verschwinden zu sehen, bei der Aktivierung von C ++ auf einem bestimmten Compiler.

Stellen Sie sicher, dass Ihre #define nicht für C ++ Code #if'ed geführt wird, z.B. #ifndef __cplusplus.

Versuchen g++ -E die Präprozessorausgabe zu sehen und zu überprüfen, ob die #define angezeigt.

Auch selbst für Präprozessormakros, beginnend Namen mit einem Unterstrich und Großbuchstaben oder zwei Unterstrichen sind für die Compiler und Bibliothek reserviert. Wenn Sie einen Makro haben müssen, der beste Name für sie PACKED sein könnte.

#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);

Ein anderer Schnipsel. finden Sie in den neuen #define ENUM

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top