在C、C++中检测Windows或Linux

15 浏览
0 Comments

在C、C++中检测Windows或Linux

我正在编写一个跨平台的程序。我希望这个程序能在Windows和Linux下运行,所以我为这两个平台编写了两个不同的代码段。如果操作系统是Windows,我希望运行第一个代码段;如果是Linux,则运行第二个代码段。

所以我写了下面的代码,但是在Windows和Linux上构建时都出现了错误。我应该怎么解决呢?

#ifdef __unix__                    /* __unix__通常由针对Unix系统的编译器定义 */
    #define OS_Windows 0
    #include 
    #include 
    #include 
    #include 
#elif defined(_WIN32) || defined(WIN32)     /* _Win32通常由针对32位或64位Windows系统的编译器定义 */
    #define OS_Windows 1
    #include 
    #include 
    #include 
    #define DIV 1048576
    #define WIDTH 7
#endif
int main(int argc, char *argv[])
{
    if(OS_Windows)
    {
        MEMORYSTATUSEX statex;
        statex.dwLength = sizeof (statex);
        GlobalMemoryStatusEx (&statex);
        _tprintf (TEXT("内存使用率为:%*ld %%。\n"),
                    WIDTH, statex.dwMemoryLoad);
    }
    else if(!OS_Windows) // 如果操作系统是Unix
    {
        char cmd[30];
        int flag = 0;
        FILE *fp;
        char line[130];
        int memTotal, memFree, memUsed;
        flag=0;
        memcpy (cmd,"\0",30);
        sprintf(cmd,"free -t -m|grep Total");
        fp = popen(cmd, "r");
        while ( fgets( line, sizeof line, fp))
        {
            flag++;
            sscanf(line,"%*s %d %d %d",&TotalMem, &TotalUsed, &TotalFree);
        }
        pclose(fp);
        if(flag)
            printf("总内存:%d -- 已使用:%d -- 剩余:%d\n",TotalMem,TotalUsed,TotalFree);
        else
            printf("未找到\n");
    }
    return 0;
} 

0
0 Comments

在C或C++代码中,需要判断操作系统是Windows还是Linux。下面的代码给出了一个错误的逻辑判断方法,并提供了正确的解决方法。

问题出现的原因:

问题出现的原因是在代码中使用了错误的逻辑判断方式。使用if(OS_Windows)判断操作系统是否为Windows是错误的写法。这是因为在C或C++中,if语句只能根据条件的真假进行判断,而不能根据条件是否被定义来判断。

解决方法:

正确的解决方法是使用#ifdef来判断操作系统是否被定义。根据不同的操作系统定义不同的宏,然后使用#ifdef来判断宏是否被定义。下面是正确的解决方法的代码示例:

#ifdef __unix__         
...
#elif defined(_WIN32) || defined(WIN32) 
#define OS_Windows
#endif
int main(int argc, char *argv[]) 
{
#ifdef OS_Windows
 /* Windows code */
#else
 /* GNU/Linux code */
#endif    
}

0
0 Comments

在上述内容中,作者提到了在C和C++中检测Windows或Linux的方法,并指出这些方法可能会因为在不同编译器或操作系统上的不同而导致不同的结果。为了解决这个问题,作者提供了一个链接,该链接介绍了一种使用编译器预定义宏来检测操作系统的方法。这个链接中提到了几个常用的宏,例如_WIN32(用于Windows 32位或64位)、_WIN64(仅用于Windows 64位)和__unix__(用于Unix)。此外,链接还提到了对于苹果/ Mac,两个宏__APPLE__和__MACH__也可以普遍使用。

然而,还有该链接已经失效,建议提供一个替代链接。在其他回答中,有人提供了微软官方文档中关于预定义宏的链接,并指出根据文档的描述,如果只想测试是否为"Windows",那么#ifdef _WIN32应该足够了。

根据作者提供的链接,这些宏在其他主要编译器中也适用。

为了检测Windows或Linux操作系统,可以使用以下宏:

- _WIN32:用于Windows 32位或64位

- _WIN64:仅用于Windows 64位

- __unix__:用于Unix操作系统

- __APPLE__和__MACH__:用于苹果/ Mac操作系统

这些宏可以通过使用#ifdef和#endif来进行条件编译,以便根据不同的操作系统执行相应的代码。

0
0 Comments

检测C和C++中的Windows或Linux操作系统的原因是为了根据操作系统的不同编译相应的代码。下面是解决方法:

在代码中使用预处理指令 #ifdef 和 #endif 来区分不同的操作系统。在Windows平台上,包含相关的头文件和定义所需的宏;在Linux平台上,包含相关的头文件。

在Windows平台上,使用Windows API函数 GlobalMemoryStatusEx 获取内存使用情况,并输出结果。

在Linux平台上,使用命令行命令 "free -t -m|grep Total" 获取内存使用情况,并提取出总内存、已使用内存和可用内存的数值。然后输出结果。

最后,根据不同的操作系统返回不同的结果。

解决方法中的代码如下:

#ifdef _WIN32
#include 
#include 
#include 
#define DIV 1048576 
#define WIDTH 7
#endif
#ifdef linux
#include 
#include 
#include 
#include 
#endif
int main(int argc, char *argv[]) 
{
#ifdef _WIN32
    MEMORYSTATUSEX statex;
    statex.dwLength = sizeof (statex);
    GlobalMemoryStatusEx (&statex);
    _tprintf (TEXT("There is %*ld %% of memory in use.\n"), WIDTH, statex.dwMemoryLoad);
#endif
#ifdef linux
    char cmd[30];
    int flag = 0;   
    FILE *fp;
    char line[130];     
    int TotalMem, TotalFree, TotalUsed;
    
    flag=0;
    memcpy (cmd,"\0",30);
    sprintf(cmd,"free -t -m|grep Total");          
    fp = popen(cmd, "r");       
    while (fgets(line, sizeof line, fp))
    {   
        flag++;
        sscanf(line, "%*s %d %d %d", &TotalMem, &TotalUsed, &TotalFree);
    }
    pclose(fp); 
    if(flag)
        printf("TotalMem:%d -- TotalUsed:%d -- TotalFree:%d\n", TotalMem, TotalUsed, TotalFree);
    else 
        printf("not found\n");
#endif
    return 0;
}

这样,只有在Linux平台上编译Linux代码,在Windows平台上只编译Windows代码。

为了编译这段代码,将 int memTotal, memFree, memUsed; 改为 int TotalMem, TotalFree, TotalUsed;。

Cygwin是Windows的一个模拟环境,但它无法将我的系统识别为Windows。

0