c - 根据平台选择功能名称的最标准方法?

标签 c portability popen

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

该函数在 gcc 中称为 popen,在 MSVS 中称为 _popen,因此我在源代码中添加了以下内容:

#ifdef _MSC_VER
#define popen _popen
#define pclose _pclose
#endif

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

  1. _MSC_VER 是要依赖的正确标志吗?我选择它是因为我觉得linux环境“更标准”。
  2. 如果我将这些#define 放在某个头文件中,那么我在stdio.h 之前还是之后#include 是否重要>(对于 popen 的情况)?
  3. 如果 _popen 本身定义为宏,我的 #define 是否有可能会失败?出于这个或其他原因,我是否应该使用像 my_popen 这样的"new" token ?
  4. 是否有人已经为我完成了这项工作并制作了一个我可以使用的良好“可移植性 header ”文件?
  5. 还有什么我应该注意的吗?

最佳答案

  1. 最好检查特定于 windows 的定义(也许是 _WIN32),因为 mingw 也没有。 popen() 是标准化的(它是 part of the Single UNIX® Specification v2 )
  2. 没有;只要宏在首次使用之前定义,那么 _popen() 直到稍后才定义都没有关系。
  3. 没有;即使 _popen 是一个宏,您所拥有的也很好。
  4. 已经做过很多次了,但我不知道您可以使用免费许可的版本。

关于c - 根据平台选择功能名称的最标准方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4844077/

相关文章:

c - 使用 fseek() 查找用户输入的位置

使用 afl-gcc 编译 - 未检测到仪器

c - MPI 发送-接收程序中消息的值应该是多少?

c++ - Windows (Visual C) 是否有 unistd.h 的替代品?

python - 从 crontab 运行时,subprocess.popen 似乎失败

c++ - 在 UNIX(首选 Linux)上学习 C++ 编程的好书?

portability - 当一段代码被称为可移植时是什么意思?

c - 如何可移植地打开大文件支持?

c - 发送特定文件以在 C 程序下使用进行打印

python - 如何在popen子进程中使用 '>>'