在C中检测终端应用中的用户OS

时间:2013-07-06 19:39:22

标签: c linux windows macos unix

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

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

我应该提一下,我是C的初学者,需要这样的东西,所以我的代码可以在windows和/或linux上运行,而不需要为每个代码创建单独的源代码。

3 个答案:

答案 0 :(得分:5)

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

e.g。 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.所以两个字符串彼此相邻将执行特技。

答案 1 :(得分:1)

我相信你可以通过在编译期间专门化你的'函数'来避免运行时检查。那么,那么呢:

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

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

答案 2 :(得分:0)

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

This是我用来计算我的代码正在编译的平台的标题。它将根据操作系统(以及其他内容)定义不同的宏。

正在使用的东西:

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