I am writing a cross platform program. I want this one program to run under both Windows and Linux, so I have two different code segments for the two platforms. If the OS is Windows, I want the first code segment to run; if it's Linux, then I want the second code segment to run.
So I wrote the following code, but it gets an error while building both on Windows and on Linux. What should I do to solve it?
#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; }
To check the operating system of the host in a C or C++ code, we need to check the macros defined by the compiler (GNU GCC or G++). For example, on Windows platform, the compiler has a special macro named _WIN32 defined. So, if the macro _WIN32 is defined, we are on Windows.
You can use getenv() from cstdlib like so: #include <cstdlib> getenv("windir"); If you get NULL then it's not windows.
h> int uname(struct utsname *name);
In order to run a C program in Linux, you need to have a C compiler present on your systems. The most popular compiler is gcc (GNU Compiler Collection). Keep in mind that it is optional to provide the output object file (-o my_program).
It's generally done like this (more or less):
#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; }
This way, only code for linux will be compiled while on a linux platform, and only windows code will be compiled on a windows platform.
You should use the same #ifdef
instead of if(OS_Windows)
logic in your code:
#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 }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With