Outils pour utilisateurs

Outils du site


lang:c:preprocesseur

Ceci est une ancienne révision du document !


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()

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.1593779451.txt.gz · Dernière modification : 2020/07/03 14:30 de root