2010-07-22 24 views
2

Possible en double:
How can I make the preprocessor insert linebreaks into the macro expansion result?Puis-je forcer le pré-processeur C à générer une nouvelle ligne?

#define IDENTIFIER { /*new line here*/\ 
      my_multiline(); /*new line here*/\ 
      macro(); /*new line here*/\ 
     } /*new line here*/ 

Puis-je forcer le pré-processeur C pour générer une nouvelle ligne dans son extension? Je ne crois pas qu'il existe un moyen standard de le faire, mais je ne voudrais pas déranger les hacks spécifiques à la plate-forme pour Visual C++ (2008) et gcc.

Je ne suis pas intéressé par m4 ou un pré-processeur séparé.

Pourquoi je vous pose cette question:

Il est plus ou moins juste curiosité. Puisque c'est un hack je ne vais pas essayer ça en production mais j'aimerais savoir si je suis capable de le faire quand même. Il y a quelques jours, je suis tombé sur cette question:

Can you turn off (specific) compiler warnings for any header included from a specific location?

C'est une question que je voudrais moi-même solution. J'ai pensé à créer une macro pour inclure un en-tête, mais avec des pragmas corrects pour désactiver un avertissement avant d'inclure, inclure l'en-tête que je voudrais désactiver les avertissements, en activant l'avertissement après l'inclusion.

Bien sûr, je pourrais créer un script pour générer des inclusions fictives avec le pragma pour l'avertissement et l'inclusion.

Mon premier problème était que puisque #include est une directive pré-processeur une macro serait quelque peu inutile de le générer. Mais je trouve cette réponse:

Is there a way to do a #define inside of another #define?

Avec cela, je crois que je peux générer la macro si spécial comprennent que je suis en mesure de forcer le compilateur à générer des sauts de ligne dans son expansion.

Je suis à la maison en ce moment mais je posterai mon code demain quand je serai au travail.

+1

Votre '# define' a besoin d'un identifiant. Et à quoi serviraient les espaces blancs de toute façon? Vous ne voyez jamais le code développé. – GManNickG

+0

@GMan: Il veut probablement juste que la macro elle-même soit plus lisible. – CookieOfFortune

+3

Pouvez-vous expliquer pourquoi vous voulez que cela se fasse? Y a-t-il une macro particulière que vous essayez d'écrire? Peut-être qu'il y a une solution différente à votre problème. –

Répondre

6

Si vous souhaitez simplement rendre le code plus lisible dans un débogueur, vous pouvez utiliser les fonctions inline au lieu de #defined. Malheureusement, le mot-clé inline est une addition C99 à C et seulement pris en charge par les extensions propriétaires sous ANSI C (comme MSVC).

#if __STDC_VERSION__ < 199901L 
# if defined(_MSC_VER) 
# define inline __inline 
# elseif defined(__GNUC__) 
# define inline __inline__ 
# endif 
#endif 

static inline void IDENTIFIER() { 
    my_multiline(); 
    macro(); 
} 

Ceci a l'avantage supplémentaire d'être vérifié par type (et généralement moins enclin à l'erreur).

+1

Ne partez pas macro content, vous allez le regretter. Attends une minute. Vous ne le regretterez pas, mais les programmeurs de maintenance après vous maudire le jour où vous avez mis les doigts sur le code. :) –

+0

@C Johnson: Sauf si le "programmeur de maintenance" dans ce cas est vous-même. –

+0

+1 pour inline .... Je n'ai pas aimé le dernier "d" dans # défini ci-dessus dans votre réponse ;-) – KedarX