得到的答案 都不好。為什么,因為他們都不知道原理。其實原理很簡單,編譯器 參數或Makefile添加了宏定義,你才可以這樣去判斷。
比如編譯器設置了宏 is_windows,你才能去用。不設置沒法用。
但是,我敢肯定各種編譯器 內置一些宏,比如 MS VC的cl.exe ,LINUX的GNU gcc,在各個平台都會有不同的內置宏的。
所以 如果我搜索 "各個編譯器 內置宏 操作系統" 少量的答案中 有一個 :
C++:編寫跨平台程序的關鍵,C/C++中的內置宏定義 分兩部分: 操作系統判定: Windows: WIN32 Linux: linux Solaris: __sun 編譯器判定: VC: _MSC_VER GCC/G++: __GNUC__ SunCC: __SUNPRO_C和__SUNPRO_CC 轉載自:http://blog.csdn.net/avagrant158/article/details/6298145
還算湊合,但是還不夠,各個編譯器 到底內置那些宏,我們怎么才能知道呢?你得告訴我方法啊,沒法弄,有空了去msdn查查(也不一定能查到,他們不一定說的),gcc可以看源代碼,但是那么多代碼,老費勁了。
下面 根據這個,我寫了個跨平台的C++程序。不過 _UNIX WINDOWS倆宏 暫時是錯誤的。不會輸出
testDefineOS.cpp源碼
#include <stdio.h> #include <iostream> using namespace std; int main(int argc,char **argv){ int no_os_flag=1; #ifdef linux no_os_flag=0; cout<<"It is in Linux OS!"<<endl; #endif #ifdef _UNIX no_os_flag=0; cout<<"It is in UNIX OS!"<<endl; #endif #ifdef __WINDOWS_ no_os_flag=0; cout<<"It is in Windows OS!"<<endl; #endif #ifdef _WIN32 no_os_flag=0; cout<<"It is in WIN32 OS!"<<endl; #endif if(1==no_os_flag){ cout<<"No OS Defined ,I do not know what the os is!"<<endl; } return 0; }
在win /Linux 使用 MS VC cl.exe編譯器(不知道如何稱呼cl.exe,大家一般不這么叫吧,但是gcc確實可以那么叫),和 gcc編譯器的結果
Win Cl.exe編譯器結果 ============== D:\>cl.exe testDefineOS.cpp 用於 80x86 的 Microsoft (R) 32 位 C/C++ 優化編譯器 16.00.40219.01 版 版權所有(C) Microsoft Corporation。保留所有權利。 testDefineOS.cpp C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xlocale(323) : wa rning C4530: 使用了 C++ 異常處理程序,但未啟用展開語義。請指定 /EHsc Microsoft (R) Incremental Linker Version 10.00.40219.01 Copyright (C) Microsoft Corporation. All rights reserved. /out:testDefineOS.exe testDefineOS.obj D:\>testDefineOS.exe It is in WIN32 OS! D:\> Linux GCC編譯器結果 ================== ayanmw@ayanmw-desktop:~$ g++ test testDefineOS.cpp ;./a.out It is in Linux OS! ayanmw@ayanmw-desktop:~$ Windows GCC.exe(MINGW) ======================= D:\>g++ testDefineOS.cpp D:\>a.exe It is in WIN32 OS! D:\>
關於 C中的預編譯宏定義 還請看http://os.chinaunix.net/a2008/1216/989/000000989777.shtml