GNU/Linux >> Belajar Linux >  >> Linux

Mendeteksi Windows atau Linux di C, C++

Biasanya dilakukan seperti ini (kurang lebih):

#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;
}

Dengan cara ini, hanya kode untuk linux yang akan dikompilasi saat berada di platform linux, dan hanya kode windows yang akan dikompilasi di platform windows.


Anda harus menggunakan #ifdef yang sama bukannya if(OS_Windows) logika dalam kode Anda:

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

Anda membingungkan variabel (yang ada saat run-time) dengan simbol preprocessor (yang hanya ada selama kompilasi).

Setelah Anda melakukan sesuatu seperti #define OS_Windows 1 , Anda tidak dapat menggunakan simbol OS_Windows sebagai variabel dan memasukkannya ke dalam if() s... Maksud saya, Anda bisa, tetapi akan diperluas selama kompilasi ke if (1) .

Untuk proyek lintas platform, Anda harus menggunakan #if atau #ifdef untuk memastikan bahwa kompiler memilih bagian kode yang benar untuk OS tertentu dan mengkompilasi hanya itu.

Sesuatu seperti:

void openWindow() {
#if OS_Windows
    // windows-specific code goes here
#else
    // linux-specific code
#endif
}

Saya melihat banyak variasi solusi di sini, yang membuat saya tidak nyaman... Bagaimana jika mereka bekerja di Linux tetapi tidak di Windows atau di Windows tetapi tidak di Linux? Bagaimana jika mereka hanya bekerja pada beberapa kompiler? Dll.

Jadi saya menemukan tautan ini, yang saya suka:https://web.archive.org/web/20191012035921/http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system

Sepertinya ini yang terbaik (menggunakan #ifdef, #endif, dll.):

  • _WIN32 untuk Windows 32 bit ATAU 64 bit
  • _WIN64 hanya untuk Windows 64 bit
  • __unix__ untuk Unix

Linux
  1. 10 ALASAN MENGUBAH WINDOWS 10 KE LINUX

  2. Linux – Bagaimana Cara Menghapus Instalasi Grub?

  3. Kompilasi C++ di Windows dan Linux:sakelar ifdef

  1. Linux vs Windows Hosting

  2. Perbaiki Instalasi Pengaturan Windows atau Linux Tidak Dapat Mendeteksi Drive Harddisk SATA

  3. Cara mengkompilasi kode Visual C++ Windows di Linux

  1. 5 OS Linux Terbaik Untuk Menggantikan Windows XP

  2. Skrip PHP - mendeteksi apakah berjalan di bawah linux atau Windows?

  3. exFAT vs NTFS di Linux