我正在写一个跨平台的程序.我希望这一个程序同时在Windows和Linux下运行,所以我有两个不同的代码段用于这两个平台.如果操作系统是Windows,我希望运行第一个代码段;如果是Linux,那么我希望运行第二个代码段.

因此,我编写了以下代码,但在Windows和Linux上构建时出现错误.我应该怎么做才能解决这个问题呢?

#ifdef __unix__                    /* __unix__ is usually defined by compilers targeting Unix systems */

    #define OS_Windows 0
    #include <unistd.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>

#elif defined(_WIN32) || defined(WIN32)     /* _Win32 is usually defined by compilers targeting 32 or   64 bit Windows systems */

    #define OS_Windows 1
    #include <windows.h>
    #include <stdio.h>
    #include <tchar.h>
    #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("There is  %*ld %% of memory in use.\n"),
                    WIDTH, statex.dwMemoryLoad);

    }

    else if(!OS_Windows) // if OS is 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("TotalMem:%d -- TotalUsed:%d -- TotalFree:%d\n",TotalMem,TotalUsed,TotalFree);
        else
            printf("not found\n");

    }

    return 0;
}

推荐答案

通常是这样做的(或多或少):

#ifdef _WIN32
#include <windows.h>
#include <stdio.h>
#include <tchar.h>

#define DIV 1048576 
#define WIDTH 7
#endif

#ifdef linux
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#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代码.

C++相关问答推荐

C中空终止符后面的数字?

为什么在C中设置文件的位置并写入文件,填充空字符?

在C中使用动态内存分配找到最小的负数

如何创建由符号组成的垂直结果图形?

C:fopen是如何实现二进制模式和文本模式的?

Can函数指针指向C++中具有不同参数连续性的函数

在列表中插入Int指针(C)

使用sscanf获取零个或多个长度的字符串

获取每个循环迭代结束时的当前时间

为什么我从CSV文件中进行排序和搜索的代码没有显示数据的所有结果?

如何在GET_STRING输入后对少数几个特定字符串进行C判断?

在C中包装两个数组?

理解bzip2的BZ2_解压缩函数中的状态重新分配

Go和C中的数据 struct 对齐差异

即使我在C++中空闲,也肯定会丢失内存

将某些内容添加到链接列表时,列表中的其他项将使用最后添加的项的名称

OMP并行嵌套循环

如何解释数组中的*(ptr)和*(ptr+2)?

strided memcpy(3) 在 libvpx 中如何工作

这种 C 函数风格的名称是什么?