2010-05-31 1 views
0

Je suis en train de compiler du code source avec Visual C++ 2010 Express. Le code a été écrit pour GCC, et contient des attributs comme ceci:Macros à l'échelle de la solution Visual C++ 2010 avec les paramètres

struct something { 
... 
} __attribute__((packed)); 

Puisque ce n'est pas la syntaxe standard C++, Visual C++ ne reconnaît pas. Avec cette macro avant la déclaration de struct, cela fonctionne très bien:

#define __attribute__(p) 

Mais je ne veux pas modifier les fichiers. J'ai créé une nouvelle feuille de propriétés (GccCompat), et je suis allé à préprocesseur Définitions, et a ajouté la macro, comme ceci:

__attribute__(p) 

ou comme ceci:

__attribute__(p)= 

Mais cela ne fonctionne pas. Ce n'est tout simplement pas appelé. Si je définis juste __attribute__ (sans paramètres) dans le même emplacement, la macro est correctement définie. Notez que la ligne de commande générée est correcte (les macros avec paramètres sont transmises exactement de la même manière que les autres), mais le compilateur semble l'ignorer. Alors, comment puis-je globalement définir ma macro avec un paramètre?

+0

Est-ce une faute de frappe? L'extension GCC est '__attribute__' mais vous mentionnez' __attributes__' dans la section MSVC de la question. –

+0

C'est une faute de frappe. J'ai utilisé '__attribute__' dans le vrai projet. – OregonGhost

Répondre

1

Cela pourrait être impossible, du moins de cette façon. Notez que documentation of the /D option de Microsoft ne spécifie pas une syntaxe pour les macros qui prennent des arguments.

+0

Puisque vous avez écrit "au moins de cette façon", j'accepterais aussi d'autres façons :) Je ne veux tout simplement pas changer le code d'origine, si ce n'est pas nécessaire. Je ferai en ajoutant une compilation conditionnelle pour l'emballage si je ne trouve pas une meilleure solution, cependant. – OregonGhost

1

La définition de macros dans l'EDI est généralement axée sur la nature de la création d'un indicateur/D: CPP_TOKEN pour le compilateur, c'est-à-dire #define CPP_TOKEN.

Dans les paramètres du compilateur avancés, vous pouvez être en mesure de définir une telle macro/D: « attributs (p) =/rien/» ou quelque chose comme ça. Ouvrez simplement l'invite de commande VS et voyez ce qu'il dit. GCC 4.2 permettra quelque chose comme ça (en utilisant son commutateur -D), mais je n'ai pas MSVC10 à portée de main.

+0

Notez que l'ajout d'une macro avec des paramètres à la feuille de propriétés * générera '/ D" __attribute __ (p) "' comme ligne de commande. Ça ne marche tout simplement pas. Cependant, "avancé" semble être un bon point: Dans les options avancées de C++, il y a une option forcée d'inclusion de fichier. J'ai créé un petit fichier juste avec la définition requise et l'ai ajouté comme obligatoire, et cela fonctionne. Maintenant, pour une raison étrange, j'ai trouvé des occurrences de '__attribute' (sans les traits de soulignement) – OregonGhost

Questions connexes