我将谈到这个具体的功能:
bool probe() {
#ifdef TARGET_OS_MAC
return probe_macosx();
#elif defined __linux__
return probe_linux();
#elif defined _WIN32 || defined _WIN64
return probe_win();
#else
#error "unknown platform"
#endif
}
以这种方式编写,作为一个if-elif-else链,消除了错误,因为它不可能编译没有一个有效的return语句或击中#error。
(我相信WIN32是为32位和64位Windows定义的,但我不能确定地告诉你没有查找它,这将简化代码。)
不幸的是,你不能使用#ifdef _WIN32 || _WIN64:请参阅http://codepad.org/3PArXCxo以获取示例错误消息。您可以使用特殊的仅预处理定义的运算符,如上所述。
关于根据功能或整个文件分割平台(如suggested),您可能或可能不想这样做。它将取决于您的代码的详细信息,例如平台之间共享的内容,以及您(或您的团队)最适合保持功能同步等问题。
此外,您应该在构建系统中处理平台选择,但这并不意味着您不能使用预处理器:为每个平台有条件地定义(由makefile或构建系统)宏。事实上,这是模板和内联函数通常最实用的解决方案,这使得它比尝试消除预处理器更灵活。它与整个文件方法很好地结合,所以你仍然使用适当的。
您可能需要一个配置头,将所有各种编译器和平台特定的宏转换为您所控制的知名宏和理解宏。或者你可以在你的编译器命令行中添加-DBEAKS_PLAT_LINUX,通过你的编译系统来定义宏(记住使用宏名称的前缀)。