Bonjour,
Je travail sur un code, qui n'est pas de moi, où je trouve beaucoup beaucoup de macros (sur plusieurs lignes). Outre le fait que c'est assez moche, et assez difficilement debugguable (enfin je trouve), il y a des petites subtilités. J'ai le code suivant :
Je n'avais au départ par la moindre idée de la signification des ##. J'ai alors lu la documentation du préprocesseur, de GCC. J'ai lu que c'était utilisé pour faire de la stringification et de la concatenation, et tout s'est éclaircit. En gros, dans l'exemple on veut au final faire un sizeof de OasisStartConnexionReq, qui est une classe. Le seul soucis, c'est que gcc n'a pas l'air de le prendre comme ça, ou en tout cas je me récupère des erreurs du type error: init_Msg_header' undeclared (first use this function), fonction qui est normalement définit par cette macro. Je me pose donc 2 questions :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #define m_OasisMsg_sizefct(type) \ static unsigned short MaxSizeofMsg() {return(sizeof(Oasis##type) \ -sizeof(RadioMsgHeader::sizeofLength()));}; \ static unsigned short sizeofMsgWithoutData( void ) \ { \ return(MaxSizeofMsg() - MaxSizeofDataPart()); \ } \ unsigned short sizeofMsg( void ) \ { \ //.. } /* * qui est appelée comme ce qui suit, dans une classe par exemple. */ m_OasisMsg_BASIC_FUNCTIONS(StartConnexionReq,E_MNGT_START_CONNEXION_REQ ,C_ACK_REQUESTED)
1. Le project a été codé au départ avec Visual Studio 6, qui, si je ne me trompe pas, ne supporte pas vraiment les standards puisqu'il est presque aussi vieux. Est-ce le comportement est le même pour le préprocesseur de VC++ 6 et gcc ?
2. Dans la documentation du préprocesseur, j'ai cru ne pas comprendre, des histoire d'espace. Est-ce réellement la bonne syntaxe ?
L'exemple donnée dans la documentation du préprocesseur de gcc marche bien (ce qui est normal), et est le suivant.
Enfin, une autre utilisation est le cas suivant. Et là, c'est le drame pour ma compréhension.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 #define COMMAND(NAME) { #NAME, NAME ## _command } struct command commands[] = { COMMAND (quit), COMMAND (help), ... };
Si quelqu'un a des pistes, ça pourrait m'être grandement utile
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 #define m_OasisMsg_init_Bobo(code,ackFlag) \ void init_Bobo(unsigned char AckFlag=##ackFlag){ \ this->msg_header.init(ntohs(code) \ ,ntoh(sizeofMsg()),AckFlag); \ }. (en espérant de pas poster encore une fois de plus dans le mauvais forum)
Partager