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

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

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

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

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

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

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

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

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

Ответ 1

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

#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"

Ответ 2

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

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