c / C++ (VS2008) заключите макрос param в кавычки

для многих вызовов функций в приложении C, которое нуждается в некоторой степени отладки, я хотел добавить макрос, чтобы облегчить ввод, который я должен был сделать.

прямо сейчас я вызываю такую функцию:

aDebugFunction(&ptrToFunction, __LINE__, "ptrToFunction", param1, param2, etc)

поэтому я подумал, что давайте напишем макрос, который делает первые 3 параметра для меня, например:

#define SOMEDEFINE(x) &x, __LINE__,  "x"

однако, как большинство из вас сразу поймет, это не сработает, он не заменит "x" на имя, которое было дано x, но просто передаст " x " как 3-й параметр.

мои знания этого макроса препроцессора довольно ограничены, и поэтому моя способность к гуглению также совершенно бесполезна из-за незнания, где именно искать.

Я надеюсь, что один из вас, ребята / девушки, может дать мне решение или указать мне в правильном направлении.

2 ответов


вам нужно использовать # преобразовать токен в строковую команду препроцессора. Вы должны определить свой второй макрос следующим образом:

#define SOMEDEFINE(x) &x, __LINE__,  # x

или x также может быть вызов макроса, и вы хотите, чтобы строка содержала расширение макроса, вам нужно использовать вспомогательный макрос:

#define TOKEN_TO_STRING(TOK) # TOK
#define STRINGIZE_TOKEN(TOK) TOKEN_TO_STRING(TOK)
#define SOMEDEFINE(x) &x, __LINE__, STRINGIZE_TOKEN(x)

например, если у вас есть следующий код:

#define SHORT_NAME a_very_very_very_long_variable_name
SOMEDEFINE(SHORT_NAME)

затем, с первым макросом, он будет расширяться до

&a_very_very_very_long_variable_name, __LINE__, "SHORT_NAME"

а, с второй макрос, он будет расширяться:

&a_very_very_very_long_variable_name, __LINE__, "a_very_very_very_long_variable_name"

вы можете сделать намного лучше, чем это: #define SOMEDEFINE( X, ... ) aDebugFunction( &(X), __LINE__, #X, __VA_ARGS__ )

затем вы можете просто вызвать этот код следующим образом:SOMEDEFINE( ptrToFunction, param1, param2, etc )
И что бы эффектно назвать:aDebugFunction( &( ptrToFunction ), __LINE__, "ptrToFunction", param1, param2, etc )