通常は次のように行われます (多かれ少なかれ):
#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 コードのみがコンパイルされます。
同じ #ifdef
を使用する必要があります if(OS_Windows)
の代わりに コード内のロジック:
#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
}
変数 (実行時に存在する) とプリプロセッサ シンボル (コンパイル中にのみ存在する) を混同しています。
#define OS_Windows 1
のようなことをした後 、シンボル OS_Windows を変数として使用して if()
内に置くことはできません s...つまり、できますが、コンパイル中に if (1)
に展開されます .
クロスプラットフォーム プロジェクトの場合、#if
を使用する必要があります または #ifdef
コンパイラが特定の OS に対してコードの正しい部分を選択し、その部分だけをコンパイルするようにします。
次のようなもの:
void openWindow() {
#if OS_Windows
// windows-specific code goes here
#else
// linux-specific code
#endif
}
ここにはさまざまなソリューションがたくさんあり、不快に感じます...それらがLinuxでは機能するがWindowsでは機能しない場合、またはWindowsでは機能するがLinuxでは機能しない場合はどうなりますか?一部のコンパイラでしか機能しない場合はどうなりますか?など
それで、私が気に入っているこのリンクを見つけました:
これらが最適のようです (#ifdef、#endif などを使用):
_WIN32
Windows 32 ビットまたは 64 ビット用_WIN64
Windows 64 ビットのみ__unix__
Unix用
バイナリを /bin、/sbin、/usr/bin、および /usr/sbin にインストールし、 --prefix および DESTDIR と対話します
実行されたシェルコマンドの結果をPythonの変数に保存する方法は?