Comment réécrire les initialiseurs désignés de la structure C sur C89 (ou compilateur C MSVC)

les gars, j’ai ce problème:

Normalement, dans C99 GCC (cygwin / MinGW / linux), il existe une syntaxe de notation par points pour les initialiseurs dans la structure C.
Comme ça:

//HELP ME HOW TO REWRITE THIS (in most compact way) to MSVC static struct my_member_t my_global_three[] = { {.type = NULL, .name = "one"}, {.type = NULL, .name = "two"}, {.type = NULL, .name = "three"}, }; 

Avoir my_memeber_t défini dans le fichier d’en-tête comme:

 struct my_member_t { struct complex_type * type; char * name; int default_number; void * opaque; }; 

Je comstack le code linux dans MSVC 9.0 (Visual Studio 2008), sur cygwin / MinGW, cela fonctionne bien.
MAIS cl est incapable de comstackr ceci (à cause de la mise en œuvre misérable de C99): error C2059: syntax error : '.'

PROBLEM:
How to rewrite (many) global structs in a way that MSVC
PROBLEM:
How to rewrite (many) global structs in a way that MSVC
(resp C89) can comstack it?


Cordialement et merci pour vos suggestions …

Misérable mise en œuvre C99? Je ne pense pas que le compilateur C dans VC2008 essaye même d’implémenter C99. Certaines fonctionnalités peuvent être empruntées, mais il s’agit en réalité d’un compilateur C89 / 90.

Il suffit de déposer les étiquettes de nom de champ

 static struct my_member_t my_global_three[] = { { NULL, "one"}, { NULL, "two"}, { NULL, "three"}, }; 

Dans ce cas, c’est facile, car l’ordre des initialiseurs dans le code d’origine est le même que l’ordre des champs dans la structure. Si l’ordre était différent, vous devrez les réorganiser dans la version sans étiquette C89 / 90.

Et s’il s’agit vraiment de my_member_t , vous devez alors déclarer le pointeur de chaîne sous la forme const char * ou arrêter d’initialiser ces membres avec des littéraux de chaîne.

Merci pour votre information, Nico.

Cependant, j’ai découvert que les structures avec des tableaux à l’intérieur ne fonctionnaient pas. Je propose cette modification qui fonctionne à la fois dans C99 et MSVC (vérifié dans MSVC ++ 2010 Express):

 #ifdef HAVE_DESIGNATED_INITIALIZERS #define SFINIT(f, ...) f = __VA_ARGS__ #else #define SFINIT(f, ...) __VA_ARGS__ #endif typedef struct { int val; int vecB[4]; int vecA[4]; } MyStruct_ts; static const MyStruct_ts SampleStruct = { SFINIT(.val , 8), SFINIT(.vecB , { 1, -2, 4, -2}), SFINIT(.vecA , { 1, -3, 5, -3}), }; 

De cette façon, vous pouvez utiliser un seul fichier pour MSVC et d’autres compilateurs.

 /* * Macro for C99 designated initializer -> C89/90 non-designated initializer * * Tested. Works with MSVC if you undefine HAVE_DESIGNATED_INITIALIZERS. Cscope also * groks this. * * ("SFINIT" == struct field init, but really, it can be used for array initializers too.) */ #ifdef HAVE_DESIGNATED_INITIALIZERS #define SFINIT(f, v) f = v #else #define SFINIT(f, v) v #endif struct t { char f1; int f2; double f3; }; struct tt = { SFINIT(.f1, 'a'), SFINIT(.f2, 42), SFINIT(.f3, 8.13) };