Mar*_*all 6 c++ c-preprocessor
我正在为我的应用程序在C/C++中开发一个平台层.
我想要
#define WINDOWS // on Windows machines
#define ANDROID // on Android phones
由于与其他库的冲突而定义非常常见的关键字如"WINDOWS"或"ANDROID"是不是一个坏主意,并且为这些关键字添加前缀是否有意义:
#define MYLIB_WINDOWS // Not used by any other 3rdparty libraries
#define MYLIB_ANDROID
我想要
注意在库的头文件中公开带有"常用"名称的宏.
还要注意私有代码中通常命名的宏 - 特别是如果它#include(直接或间接)其他库的头文件.
你不能依赖所有图书馆维护者都像你一样表现良好的希望.
并且为这些关键字添加前缀是否有意义:
一般来说,是的.
一个很好的例子是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
Run Code Online (Sandbox Code Playgroud)