C++ Can';不使用预处理器语句禁止标准函数吗?

C++ Can';不使用预处理器语句禁止标准函数吗?,c++,c-preprocessor,C++,C Preprocessor,试图解决此问题:使用宏使abs功能不再可用 如果我编译的代码包含myabs(3)使用g++选项-Dmyabs=abs编译(myabs被abs替换),很好 现在,如果我编译一个包含abs(3)的代码带有g++选项-Dabs=probled它也会编译…为什么它不报告probled未知?在预处理过程中,abs似乎没有被禁止的替换…为什么 看起来abs在预处理过程中并没有被禁止替代…为什么 至少是我使用的标准库标题(libstdc++),用于定义::abs,取消定义宏: //去掉那些代替实函数定义的宏。

试图解决此问题:使用宏使
abs
功能不再可用

如果我编译的代码包含
myabs(3)使用g++选项
-Dmyabs=abs
编译(
myabs
abs
替换),很好

现在,如果我编译一个包含
abs(3)的代码带有g++选项
-Dabs=probled
它也会编译…为什么它不报告
probled
未知?在预处理过程中,
abs
似乎没有被
禁止的
替换…为什么

看起来abs在预处理过程中并没有被禁止替代…为什么

至少是我使用的标准库标题(libstdc++),用于定义
::abs
,取消定义宏:

//去掉那些代替实函数定义的宏。
#未定义abs
#未定义分区
// ...

你的标题也可以做同样的事情。考虑到这样的不定义,使用预处理器宏确实不可能禁止这样的函数。

如果它由include-guards保护,您可以使用-include-cmath编译器参数强制包含它,然后定义abs宏(未经测试)好答案:
abs
在我包含
数学之前被
禁止的
替换,不是之后,所以必须执行
#取消abs
// Get rid of those macros defined in <math.h> in lieu of real functions.
#undef abs
#undef div
// ...