2

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

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

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

4

3 回答 3

5

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

例如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>命令行上添加 a 的方法,方法是为您用于为该架构编译的工具使用预定义的宏)。

或者,您可以通过打印“清除屏幕”的ANSI 转义序列来做同样的事情,但更快更好(但不是 100% 可移植) :

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

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

于 2013-07-06T19:49:12.437 回答
1

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

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

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

于 2013-07-06T19:47:08.213 回答
0

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

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

使用中这样的东西:

#if defined(UTIL_PLATFORM_WINDOWS)
    printf("windows\n");
#elif defined(UTIL_PLATFORM_UNIXLIKE)
    printf("Unix\n");
#endif
于 2013-07-06T19:46:46.300 回答