Pourquoi le compilateur se plaint de cette déclaration de macro

J’écris la macro suivante pour la facilité de débogage,

1 #ifndef DEF_H 2 #define DEF_H 3 #define DEBUG_MODE 4 #define DEBUG_INFO(message) \ 5 #ifdef DEBUG_MODE \ 6 cout << message << endl; \ 7 #endif \ 8 #endif 

mais gcc se plaint comme suit

 def.h:4: error: '#' is not followed by a macro parameter def.h:1: error: unterminated #ifndef 

Quel est le problème avec ce morceau de code? Est-ce que je manque des points importants ici?

Vous ne pouvez pas avoir #ifdef dans une définition de macro. Vous devez le retourner à l’envers:

 #ifdef DEBUG_MODE #define DEBUG_INFO(message) cout << (message) << endl #else #define DEBUG_INFO(message) #endif 

Vous ne pouvez pas incorporer une directive de préprocesseur dans une autre directive de préprocesseur ( #ifdef DEBUG_MODE dans la définition de DEBUG_INFO ). Au lieu de cela, faites quelque chose comme

 #ifdef DEBUG_MODE # define DEBUG_INFO(message) cout << message << endl #else # define DEBUG_INFO(message) 0 #endif 

(Ce n’est pas encore idéal; le codage macro défensif suggère quelque chose comme:

 #ifdef DEBUG_MODE # define DEBUG_INFO(message) do {cout << message << endl;} while (0) #else # define DEBUG_INFO(message) 0 #endif 

Peut-être qu'une fonction en inline fonctionnerait mieux.)

Je geuss si vous mangez ‘\’ à la ligne 7, le morceau de code fonctionnera.