我知道标题很奇怪,所以这里是解释:
我有一些我不想修改的代码,但是我需要重新定义一些功能。
最小的例子是这样的:
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
,并解释您得到的结果。