c / c ++ (VS2008) заключает макрокоманду в кавычки - PullRequest
10 голосов
/ 02 марта 2011

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

сейчас я вызываю функцию, подобную этой:

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

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

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

Однако, как большинство из вас сразу поймет, этот выигрышне сработает, он не заменит «x» именем, которое было дано x, а просто передаст «x» в качестве 3-го параметра.

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

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

Ответы [ 2 ]

11 голосов
/ 02 марта 2011

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

#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"
1 голос
/ 18 октября 2013

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...