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

时间:2013-03-05 13:04:32

标签: c++ g++ c-preprocessor

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

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

int main()
{
strcpy_s(a,b);
}

但是当我跑这个时:

$ g++ -E -P -w -D"strcpy_s(D,S)   strcpy(D,S) buahaha" test.cpp

我明白了:

int main()
{
strcpy(a,b) buahaha 1;
}

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

2 个答案:

答案 0 :(得分:5)

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

  • -Dname
  • -Dname=value

第一个将name定义为1,第二个将name定义为value

允许

name包括括号,以便您可以在命令行上定义类似函数的宏。像-Dfoo bar这样的内容不包含等号,因此它被解释为尝试将foo bar定义为1。宏名称不能包含空格,因此这可能会导致错误消息,但不会被检测到,并且最终会使编译器混乱。请改为-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,并解释您获得的结果。

答案 1 :(得分:2)

The documentation表明-D选项的语法中有一个等号,您没有使用它。

你的命令应该是:

$ g++ -E -P -w -D"strcpy_s(D,S)=strcpy(D,S)" test.cpp