C 根据平台选择函数名的最标准方法是什么?
我目前正在使用由两个编译器编译的代码中的C 根据平台选择函数名的最标准方法是什么?,c,portability,popen,C,Portability,Popen,我目前正在使用由两个编译器编译的代码中的popen函数:MS Visual Studio和gcc(在linux上)。我可能想稍后添加gcc(在MinGW上) 对于gcc,函数名为popen,但是对于MSV,函数名为\u popen,因此我在源代码中添加了以下内容: #ifdef _MSC_VER #define popen _popen #define pclose _pclose #endif 这是可行的,但我想了解是否存在针对此类问题的标准解决方案(我记得stricmp/stracecmp
popen
函数:MS Visual Studio和gcc(在linux上)。我可能想稍后添加gcc(在MinGW上)
对于gcc,函数名为popen
,但是对于MSV,函数名为\u popen
,因此我在源代码中添加了以下内容:
#ifdef _MSC_VER
#define popen _popen
#define pclose _pclose
#endif
这是可行的,但我想了解是否存在针对此类问题的标准解决方案(我记得stricmp
/stracecmp
)。具体而言,我想了解以下几点:
\u MSC\u VER
是依赖的正确标志吗?我选择它是因为我觉得linux环境“更标准”#定义#放在某个头文件中,那么在stdio.h
之前还是之后包含是否重要(对于popen
\u popen
定义为宏本身,我的\define
是否有可能失败?出于这样或那样的原因,我应该使用“新”令牌,如my_popen
\u MSC\u VER
是检测MSVC编译器的正确宏。您可以对GCC使用\uuuu GNUC\uuu
popen
作为宏ID,我建议您将#包含在它之后,因为3
使用
#ifdef
等进行测试的方式很好,但测试的宏却不是这样popen
取决于您的操作系统,而不是编译器
我喜欢这样的东西
#if defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 2)
/* system has popen as expected */
#elif defined(YOUR_MACRO_TO DETECT_YOUR_OS)
# define popen _popen
# define pclose _pclose
#elif defined(YOUR_MACRO_TO DETECT_ANOTHER_ONE)
# define popen _pOpenOrSo
# define pclose _pclos
#else
# error "no popen, we don't know what to do"
#endif
与其以包含
#ifdef
的凌乱文件结束。#else
。#endif
块,我更喜欢为不同平台使用不同文件的版本:
- 将依赖操作系统的定义放在每个平台的一个文件中,并定义一个宏
my\u popen
#将此文件包含在平台无关代码中
- 永远不要直接调用操作系统函数,而是调用您创建的
(即#define
)my\u popen
- 根据您的操作系统,使用不同的头进行编译(例如windows上的
,linux上的config/windows/mydefines.h
,因此设置适当的包含路径,并始终config/linux/mydefines.h
)#包含“mydefines.h”
mydefines.h
文件,还需要存放在config/OSTYPE
目录中的myfunctions.c
文件
这样做,在区分linux和windows版本时,您还可以获得优势:您可以简单地区分两个文件,而在相同的文件的linux和windows块上进行区分可能很困难