【问题标题】:c/c++ (VS2008) enclose macro param in quotesc/c++ (VS2008) 将宏参数括在引号中
【发布时间】:2011-03-02 10:43:30
【问题描述】:

对于需要一定程度调试的 C 应用程序中的许多函数调用,我想添加一个宏来简化我必须执行的输入操作。

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

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

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

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

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

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

我希望你们中的一个人可以给我一个解决方案或指出我正确的方向。

【问题讨论】:

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


    【解决方案1】:

    您需要使用预处理器的# convert token to string 命令。你应该这样定义你的第二个宏:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-19
        • 2012-06-04
        • 2021-07-22
        相关资源
        最近更新 更多