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

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

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可以执行某些操作。

最佳答案

您可以使用两种方法使用-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,并解释您得到的结果。

09-06 21:45