了解使用#的C ++宏

时间:2011-12-21 09:57:50

标签: c++ macros

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

#define ASSERT(a) \
if (! (a)) \
{ \
  std::string c; \
  c += " test(" #a ")";
}
请告诉我在这里使用#? 我想把宏放在静态函数中,但在我想完全理解它的作用之前。

由于

3 个答案:

答案 0 :(得分:7)

在宏中使用#意味着宏参数将用引号""包装:

#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预处理器)文档中的条目链接:

答案 1 :(得分:2)

在宏中,#“字符串化”变量名称。通过“stringify”我的意思是,变量名称被转换为字符串文字。

例如,如果您有以下宏:

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

并使用它:

int i;
PRINT_VARIABLE_NAME(i);

它会打印“我”。

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

答案 2 :(得分:0)

#a是一个包含文字a的字符串。有关详情,请参阅Stringfication