【问题标题】:Detecting users OS in terminal application, in C在 C 中检测终端应用程序中的用户操作系统
【发布时间】:2013-07-04 14:13:57
【问题描述】:

如何在 C 中确定终端应用程序中用户的操作系统? 例如,在下面的代码中,我应该将windowslinux 替换为什么?

/* pseudo code */
if(windows)
{system(cls)}
else if(linux)
{system(clear)}
else{...}

我应该提到我是 C 的初学者,并且需要这样的东西,这样我的代码就可以在 Windows 和/或 linux 上运行,而无需为每个单独的源代码。

【问题讨论】:

  • 必须在运行时进行检测吗?
  • 确实如此。在编译时更容易检测 - 编译器定义预处理器符号来指示您正在构建的操作系统。
  • 查看我上面评论中的链接——完美回答你的问题。
  • 是的,我想是的。我需要一个源文件,无论用户的操作系统如何,他们都可以编译和运行,而无需更改整个代码中的系统调用/命令。

标签: c linux windows macos unix


【解决方案1】:

通常,这是通过构建系统中的宏完成的(因为无论如何您都必须为每个系统构建代码。

例如gcc -DLINUX myfile.c

然后在 myfile.c 中

 #ifdef LINUX
    ... do stuff for linux ... 
 #else if defined(WINDOWS)
    ... do something for windows ... 
 #else if ... and so on. 
    ... 
 #endif

(大多数时候,您可以找到一些实际上不需要在命令行上添加-D<something> 的方法,方法是将predefined macros 用于您用于编译该架构的工具)。

或者,您也可以通过打印ANSI escape sequence 来表示“清除屏幕”来做同样的事情,但更快更好(但不是100% 便携):

putstr("\033" "2J"); 

是的,这是两个字符串,因为如果你写 "\0332J",编译将使用字符 0332,而不是字符 033,后跟数字 2。所以两个相邻的字符串就可以解决问题。

【讨论】:

    【解决方案2】:

    我相信您可以通过在编译期间专门化您的“功能”来避免运行时检查。那么,这个怎么样:

    #ifdef WIN32
       CLEAR = cls
    #elif __linux__ 
       CLEAR = clear
    #endif
    

    预定义因编译器而异,所以这里有一个很好的列表:http://sourceforge.net/p/predef/wiki/OperatingSystems/

    【讨论】:

      【解决方案3】:

      在编译时而不是运行时检测环境可能更好。使用像 C 这样的编译语言,您不会像使用 Java 这样的语言那样在不同平台上运行相同的编译器输出,因此您不需要在运行时进行这种检查。

      This 是我用来计算我的代码在哪个平台上编译的标头。它将根据操作系统(以及其他事物)定义不同的宏。

      这样的东西在使用中:

      #if defined(UTIL_PLATFORM_WINDOWS)
          printf("windows\n");
      #elif defined(UTIL_PLATFORM_UNIXLIKE)
          printf("Unix\n");
      #endif
      

      【讨论】:

        猜你喜欢
        • 2010-09-14
        • 1970-01-01
        • 2012-04-01
        • 2016-03-13
        • 1970-01-01
        • 2015-03-20
        • 1970-01-01
        相关资源
        最近更新 更多