我正在编写一个跨平台程序。我希望这个程序可以在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的代码。