Daa*_*mer 10 c c++ visual-studio-2008 c-preprocessor
对于需要一定程度调试的C应用程序中的大量函数调用,我想添加一个宏来简化我必须要做的输入.
现在我正在调用这样的函数:
aDebugFunction(&ptrToFunction, __LINE__, "ptrToFunction", param1, param2, etc)
Run Code Online (Sandbox Code Playgroud)
所以我想让我们编写一个为我做前3个参数的宏,如下所示:
#define SOMEDEFINE(x) &x, __LINE__, "x"
Run Code Online (Sandbox Code Playgroud)
但是,正如你们大多数人会立刻知道的那样,这不会起作用,它不会用给定x的名称替换"x",而只是将"x"作为第三个参数传递.
我对这个预处理器宏发生的事情的了解是非常有限的,因此我的谷歌搜索能力也是无用的,因为不知道在哪里搜索确切.
我希望你们其中一个人/女孩能给我一个解决方案,或指出我正确的方向.
Syl*_*sne 11
您需要使用#预处理器的convert token to string命令.您应该以这种方式定义第二个宏:
#define SOMEDEFINE(x) &x, __LINE__, # x
Run Code Online (Sandbox Code Playgroud)
或者如果x也可以是宏调用,并且您希望字符串包含宏的扩展,则需要使用辅助宏:
#define TOKEN_TO_STRING(TOK) # TOK
#define STRINGIZE_TOKEN(TOK) TOKEN_TO_STRING(TOK)
#define SOMEDEFINE(x) &x, __LINE__, STRINGIZE_TOKEN(x)
Run Code Online (Sandbox Code Playgroud)
例如,如果您有以下代码:
#define SHORT_NAME a_very_very_very_long_variable_name
SOMEDEFINE(SHORT_NAME)
Run Code Online (Sandbox Code Playgroud)
然后,使用第一个宏,它将扩展为
&a_very_very_very_long_variable_name, __LINE__, "SHORT_NAME"
Run Code Online (Sandbox Code Playgroud)
而使用第二个宏,它将扩展到:
&a_very_very_very_long_variable_name, __LINE__, "a_very_very_very_long_variable_name"
Run Code Online (Sandbox Code Playgroud)