对于需要一定程度调试的C应用程序中的大量函数调用,我想添加一个宏来简化我必须要做的输入。
现在我正在调用这样的函数:
aDebugFunction(&ptrToFunction, __LINE__, "ptrToFunction", param1, param2, etc)
所以我想让我们编写一个为我做前3个参数的宏,如下所示:
#define SOMEDEFINE(x) &x, __LINE__, "x"
然而,正如你们大多数人会立即知道的那样,这不会起作用,它不会用给定x的名称替换“x”,而只会将“x”作为第三个参数传递。
我对这个预处理器宏发生的事情的了解是非常有限的,因此我的谷歌搜索能力也是无用的,因为不知道在哪里搜索确切。
我希望你们其中一个人/女孩能给我一个解决方案或指出我正确的方向。
答案 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 )