c++ - 是否有某些关键字不应该是我的 "#defined"?

标签 c++ c-preprocessor

我正在用 C/C++ 为我的应用程序开发一个平台层。

我愿意

#define WINDOWS//在 Windows 机器上

#define ANDROID//在 Android 手机上

由于与其他库的冲突,定义诸如“WINDOWS”或“ANDROID”之类的非常常见的关键字是不是一个坏主意,是否可以在这些关键字前加一些前缀:

#define MYLIB_WINDOWS//不被任何其他 3rdparty 库使用

#define MYLIB_ANDROID

最佳答案

I would like to

当心在你的库的头文件中公开带有“通用”名称的宏。

还要注意私有(private)代码中通常命名的宏 - 特别是如果它#include(直接或间接)其他库的 header 。

您不能指望所有库维护者都像您一样守规矩。

and would it make sense to prefix these keywords with something:

一般来说,是的。

一个很好的例子是 BOOST 库套件。 BOOST 非常注意确保其头文件导出的所有宏都具有前缀 BOOST_。前缀与 boost:: 库的命名空间名称相匹配并非巧合。

总而言之,如果您的库是在命名空间中实现的(它应该是,否则您会污染全局命名空间),请务必使用与之匹配的宏前缀。

例子:

namespace mylib { namespace innerthing { }}

#define MYLIB_ON 1
#define MYLIB_OFF 0
#define MYLIB_SETTING MYLIB_ON
#define MYLIB_INNERTHING_SETTING MYLIB_OFF

关于c++ - 是否有某些关键字不应该是我的 "#defined"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51221991/

相关文章:

c++ - 智能指针及其在整个程序中的依赖,一次使用

c++ - 寻找代码 stub 生成器(来自头文件)

c++ - 更安全的条件编译?

c++ - 是否可以编写 C++ 模板/宏来检查两个函数是否具有相同的签名

c++ - C/C++ 宏参数包含点(成员访问运算符)

c++ - C++ Windows 中的 RAW 套接字

c++ - CLion 和 Crypto++ 库

visual-studio - gcc和MS预处理器之间的另一个区别

c - 如何编写递归 for 循环 "repeat"宏以使用 CPP 预处理器生成 C 代码?

c++ - 如何将getenv()的内容放入字符串中