【问题标题】:Understanding a C++ Macro that uses #了解使用 # 的 C++ 宏
【发布时间】:2011-12-21 09:57:49
【问题描述】:

我有一个 C++ 宏,它的语法是我以前从未见过的:

#define ASSERT(a) \
if (! (a)) \
{ \
  std::string c; \
  c += " test(" #a ")";
}

你能解释一下这里#的用法吗? 我想把宏放在一个静态函数中,但在我想完全理解它的作用之前。

谢谢

【问题讨论】:

标签: c++ macros


【解决方案1】:

在宏中使用# 意味着宏参数将用引号括起来""

#define FOOBAR(x) #x

int main (int argc, char *argv[])
{
  std::cout << FOOBAR(hello world what's up?) << std::endl;
}

输出

hello world what's up?

另一个例子

在下面我们显示了 foo.cpp 的内容,然后是预处理器运行后文件的样子:

:/tmp% cat foo.cpp
#define STR(X) #X

STR (hello world);

...

:/tmp% g++ -E foo.cpp # only run the preprocessor
# 1 "foo.cpp"
# 1 "<command-line>"
# 1 "foo.cpp"


"hello world";

我可以在哪里阅读更多内容?

查看cpp(C 预处理器)文档中条目的以下链接:

【讨论】:

    【解决方案2】:

    在宏中,#“字符串化”了变量名。我所说的“字符串化”是指将变量名转换为字符串文字。

    例如,当您有以下宏时:

    #define PRINT_VARIABLE_NAME(var) printf(#var);

    然后像这样使用它:

    int i;
    PRINT_VARIABLE_NAME(i);
    

    它会打印“i”。

    在您的情况下,字符串将与“test”连接。

    【讨论】:

    • stringifying到底是什么意思?我相信你知道这意味着什么,我也知道,但请务必花时间向外行解释。
    • 我怎样才能在方法中得到相同的结果?
    • @dau_sama 这只是预处理器的一个功能,所以它只适用于宏。你不能在常规函数中做同样的事情。
    • 在运行时,这是不可能的,因为变量只是内存位置。如果你想要这个功能,你必须使用带有宏的预处理器。
    【解决方案3】:

    #a 是一个包含文字 a 的字符串。请参阅Stringfication 了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      • 1970-01-01
      • 2014-05-16
      • 2011-04-05
      • 2022-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多