GNU/Linux >> Linux の 問題 >  >> Linux

C、C++ で Windows または Linux を検出

通常は次のように行われます (多かれ少なかれ):

#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用

Linux
  1. WINDOWS10をLINUXに変更する10の理由

  2. Windows または Linux のセットアップ インストールで SATA ハードディスク ドライブを検出できない問題を修正

  3. Windows および Linux での C++ コンパイル:ifdef スイッチ

  1. Linux – Grubをアンインストールする方法は?

  2. LinuxとWindowsホスティング

  3. PHP スクリプト - Linux と Windows のどちらで実行されているかを検出しますか?

  1. WindowsXPを置き換えるための5つの最良のLinuxOS

  2. Linux で Windows Visual C++ コードをコンパイルする方法

  3. Linux での exFAT と NTFS の比較