得到的答案 都不好。為什麼,因為他們都不知道原理。其實原理很簡單,編譯器 參數或Makefile添加了宏定義,你才可以這樣去判斷。
比如編譯器設定了宏 is_windows,你才能去用。不設定沒法用。
但是,我敢肯定各種編譯器 內建一些宏,比如 MS VC的cl.exe ,LINUX的GNU gcc,在各個平台都會有不同的內建宏的。
所以 如果我搜尋 "各個編譯器 內建宏 作業系統" 少量的答案中 有一個 :
C++:編寫跨平台程式的關鍵,C/C++中的內建宏定義分兩部分:作業系統判定:Windows: WIN32Linux: linuxSolaris: __sun編譯器判定:VC: _MSC_VERGCC/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.cppC:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xlocale(323) : warning C4530: 使用了 C++ 例外處理常式,但未啟用展開語義。請指定 /EHscMicrosoft (R) Incremental Linker Version 10.00.40219.01Copyright (C) Microsoft Corporation. All rights reserved./out:testDefineOS.exetestDefineOS.objD:\>testDefineOS.exeIt is in WIN32 OS!D:\>Linux GCC編譯器結果==================ayanmw@ayanmw-desktop:~$ g++ test testDefineOS.cpp ;./a.outIt is in Linux OS!ayanmw@ayanmw-desktop:~$ Windows GCC.exe(MINGW)=======================D:\>g++ testDefineOS.cppD:\>a.exeIt is in WIN32 OS!D:\>
關於 C中的先行編譯宏定義 還請看http://os.chinaunix.net/a2008/1216/989/000000989777.shtml