lang:c:preprocesseur
Ceci est une ancienne révision du document !
Table des matières
Convertir un nombre en chaîne de caractères
- cpp/preprocessor/str_helper.h
#pragma once #define STR_HELPER(x) #x #define STR(x) STR_HELPER(x)
Exemple d'utilisation :
- cpp/preprocessor/str_helper.cpp
#include "str_helper.h" #define VERSION STR(3) "." STR(2) "." STR(1) static const char* version __attribute__((unused)) = VERSION; int main() {}
Rendu :
- cpp/preprocessor/str_helper.cpp.i
static const char* version __attribute__((unused)) = "3" "." "2" "." "1"; int main() {}
C Preprocessor_ concatenate int to string - Stack Overflow Archive du 28/03/2011 le 17/10/2019
Ecrire un commentaire dans une macro multi lignes
#define SOME_BIG_MACRO(input)\
SOME_FUNCTION_CALL() /* this does... */ \
SOME_OTHER_FUNCTION_CALL()
Désactiver certains warnings pour certains compilateurs
Note : sous clang
et Android
, __GNUC__
est défini.
#if defined(__GNUC__) && !defined(__ANDROID__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wformat-truncation" #endif #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdocumentation" #endif #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable : 4242) #endif ... #ifdef __GNUC__ #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif #ifdef _MSC_VER #pragma warning(pop) #endif
Risque du coding style (espace avant parenthèse)
Si on souhaite faire passer des arguments à la macro, il est nécessaire que la parenthèse touche le nom de la macro. Sinon, le préprocesseur interprétera la parenthèse comme le début du remplacement.
Exemple :
- cpp/preprocessor/macro_and_spaces.cpp
#define RET_NEG (ARG1) - ARG1; int main() { int ARG1 = 1; // Interprétation erronée à cause de l'espace après ADD lors de la définition de la macro. // cppcheck-suppress unreachableCode // cppcheck-suppress constStatement return RET_NEG(ARG1); }
Rendu :
- cpp/preprocessor/macro_and_spaces.cpp.i
int main() { int ARG1 = 1; return (ARG1) - ARG1;(ARG1); }
Heureusement, l'erreur est presque toujours détectée à la compilation mais elle peut être difficilement trouvée. C'est pour cette raison que je déconseille l'utilisation d'un espace avant les parenthèses comme règle de codage.
lang/c/preprocesseur.1660811590.txt.gz · Dernière modification : 2022/08/18 10:33 de root