G ++ -D选项添加数字1

NoS*_*tAl 0 c++ g++ c-preprocessor

我知道标题很奇怪,所以这里是解释:

我有一些代码,我宁愿不修改,但我需要重新定义一些函数.最小的例子是这样的:

int main()
{
strcpy_s(a,b);
}
Run Code Online (Sandbox Code Playgroud)

但当我运行这个:

$ g++ -E -P -w -D"strcpy_s(D,S)   strcpy(D,S) buahaha" test.cpp
Run Code Online (Sandbox Code Playgroud)

我明白了:

int main()
{
strcpy(a,b) buahaha 1;
}
Run Code Online (Sandbox Code Playgroud)

这是什么1?忽略buahaha,这只是为了表明PP有所作为.

小智 5

有两种方法可以使用该-D选项:

  • -Dname
  • -Dname=value

第一个定义name1,第二个定义namevalue.

name允许包括括号,以便您可以在命令行上定义类似函数的宏.类似于-Dfoo bar包含没有等号的东西,所以它被解释为尝试定义foo bar1.宏名称不能包含空格,因此这可能会导致错误消息,但不会被检测到,并且最终会使编译器混乱.试试吧-D"strcpy_s(D,S)=strcpy(D,S) buahaha".

我怀疑发生的事情是-Dname被翻译成#define name 1并被-Dname=value翻译成#define name value,并且错误检查仅在此之后发生.这将转化-D"strcpy_s(D,S) strcpy(D,S) buahaha"#define strcpy_s(D,S) strcpy(D,S) buahaha 1并解释您获得的结果.