根据平台选择功能名称的最标准方法是什么?

ana*_*lyg 5 c portability popen

我目前正在使用popen由两个编译器编译的代码中的函数:MS Visual Studio和gcc(在linux上).我可能想稍后添加gcc(在MinGW上).

该函数被调用popen为gcc,但_popen对于MSVS,所以我在源代码中添加了以下内容:

#ifdef _MSC_VER
#define popen _popen
#define pclose _pclose
#endif
Run Code Online (Sandbox Code Playgroud)

这是有效的,但我想了解是否存在针对此类问题的标准解决方案(我记得与stricmp/ 的类似情况strcasecmp).具体来说,我想了解以下内容:

  1. 是_MSC_VER正确的旗帜依赖吗?我选择它是因为我觉得linux环境"更标准".
  2. 如果我把它们#define放在一些头文件中,那么#include它是在之前还是之后stdio.h(对于这种情况popen)是否重要?
  3. 如果_popen被定义为宏本身,我有可能#define失败吗?我应该使用"新"代币my_popen,因为这个或那个原因?
  4. 有人已经为我做了这个工作,并制作了一个很好的"可移植头"文件,我可以使用?
  5. 还有什么我应该知道的吗?

Jen*_*edt 1

您执行此操作的方式很好(使用#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
Run Code Online (Sandbox Code Playgroud)