c++ - 不能使用预处理器语句禁止标准函数吗?

标签 c++ c-preprocessor

正在尝试解决此问题:C++ How can I prevent my team developers from using integer version of abs by mistake?通过使用宏使 abs 函数不再可用。

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

现在,如果我使用 g++ 选项 -Dabs=forbidden 编译包含 abs(3); 的代码,它也会编译...为什么它不报告 forbidden 未知?看起来 abs 在预处理过程中没有被 forbidden 替换...为什么?

最佳答案

Looks like abs is not replaced by forbidden during pre-processing...why?

至少我使用的标准库头文件 (libstdc++) 定义了 ::abs,取消定义你的宏:

// Get rid of those macros defined in <math.h> in lieu of real functions.
#undef abs
#undef div
// ...

您的 header 可能做同样的事情。鉴于这样的未定义,使用预处理器宏来禁止这样的功能确实是不可能的。

关于c++ - 不能使用预处理器语句禁止标准函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38500114/

相关文章:

c++ - Qt::make_shared 用于创建 QSharedPtr 和 std::make_shared 用于创建 std::shared_ptr

c++ - 我应该停止使用抽象基类/接口(interface),而是使用 boost::function/std::function 吗?

c++ - 原子 decref 实现之间的区别

c++ - boost multi_index_container composite_key 中一个键的 equal_range,另一个键的下限/上限

c - 如何使用我的字符串将 "interleave"C/C++ 源代码(仅在适当位置的内部函数中)?

c++ - 在 C++ 中实现多变量正态 pdf 以进行图像分类

c - C 中的特殊 #define 选项

带换行符的 Fortran 预处理器宏

c - #define 宏用于 C 中的调试打印?

c - 不需要 'type' 参数且不使用 memcpy 的可移植 C SWAP 宏