c / c ++(VS2008)用引号括起宏参数

时间:2011-03-02 10:43:31

标签: c++ c visual-studio-2008 c-preprocessor

对于需要一定程度调试的C应用程序中的大量函数调用,我想添加一个宏来简化我必须要做的输入。

现在我正在调用这样的函数:

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

所以我想让我们编写一个为我做前3个参数的宏,如下所示:

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

然而,正如你们大多数人会立即知道的那样,这不会起作用,它不会用给定x的名称替换“x”,而只会将“x”作为第三个参数传递。

我对这个预处理器宏发生的事情的了解是非常有限的,因此我的谷歌搜索能力也是无用的,因为不知道在哪里搜索确切。

我希望你们其中一个人/女孩能给我一个解决方案或指出我正确的方向。

2 个答案:

答案 0 :(得分:11)

您需要使用#转换令牌来预处理器的字符串命令。您应该以这种方式定义第二个宏:

#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 :(得分:1)

你实际上可以做得更好:#define SOMEDEFINE( X, ... ) aDebugFunction( &(X), __LINE__, #X, __VA_ARGS__ )

然后您可以简单地调用此代码:SOMEDEFINE( ptrToFunction, param1, param2, etc )
这将有效地称为:aDebugFunction( &( ptrToFunction ), __LINE__, "ptrToFunction", param1, param2, etc )

相关问题