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 )