我讨厌宏.我试图避免尽可能多地使用它们,但我偶尔需要它们来启用/禁用我的代码中的功能.典型:
#ifdef THREAD_SAFE
typedef boost::mutex Mutex;
typedef boost::mutex::scoped_lock ScopedLock;
#else
typedef struct M { } Mutex;
typedef struct S { S(M m) { } } ScopedLock;
#endif
Run Code Online (Sandbox Code Playgroud)
这样我可以保持我的实际代码不变.我相信编译器在未定义宏时删除安慰剂代码.
我知道模板专业化可能是一个解决方案,但这将涉及大量重写/代码重复.
没有必要成为C++专家来猜测我在编译器上作弊的方式有问题.我正在寻找更好的解决方案.
您使用的不是宏,而是正常的预处理器功能.此外,您不是依赖于编译器,而是依赖于预处理器.
编译器只会看到两个版本中的一个,另一个在编译步骤之前被删除.使用预处理器执行(条件)包含/排除代码没有错.它不是任何"作弊",这完全是预处理器的用途.