0

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

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

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做了一些事情。

4

2 回答 2

5

您可以通过两种方式使用该-D选项:

  • -Dname
  • -Dname=value

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

name允许包含括号,以便您可以在命令行上定义类似函数的宏。like-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,并解释您得到的结果。

于 2013-03-05T13:08:08.263 回答
2

文档显示该-D选项在其语法中有一个等号,您没有使用它。

您的命令可能应该是:

$ g++ -E -P -w -D"strcpy_s(D,S)=strcpy(D,S)" test.cpp
于 2013-03-05T13:07:54.753 回答