編譯器、作業系統、CPU相關的預處理巨集定義
疑問一、How to list compiler predefined macros?
編譯器預處理巨集定義用途:
參考: http://nadeausoftware.com/articles/2011/12/c_c_tip_how_list_compiler_predefined_macros
摘:All C/C++ compilers predefine macros indicating the target
processor, operating system, language features, compiler name and version, and more. Cross-platform code can use #if/#endif
to
wrap OS-specific#include
s (such as <Windows.h>
vs. <unistd.h>
),
compiler-specific code (such as inline assembly), or processor-specific optimizations (such as SSE instructions on x86).
編譯器的預處理巨集定義使程式可以用於跨平臺操作,包括跨編譯器(典型:G++
VS VISUAL C++),跨作業系統(典型:linux vs mac vs windows),跨CPU(典型arm vs x86),也可使特定的程式碼用於特定的環境。演算法開發需要考慮多種執行環境時可以採用這些預處理巨集定義。
獲得預處理巨集定義方法:
1.採用命令列:
測試:在UBUNTU14.04LTS + GCC4.8.2+ intel cpu 環境下,使用命令 gcc -dM -E -x c /dev/null 可以得到一些有用的巨集定義值,舉例(各行內巨集定義非常相似或關聯):
#define __unix__ 1 #define
__unix 1 #define
unix 1 (UNIX系統)
#define __pentiumpro__ 1 (CPU TYPE)
#define __linux 1 #define
__linux__ 1 #define __gnu_linux__ 1 #define linux 1 (LINUX系統)
#define __GNUC__ 4 #define __GNUC_MINOR__ 8 (GNU GCC/G++)
#define __STDC__ 1 (編譯器遵循ANSI C 則值賦為1 摘自《C和指標》)
#define __i686 1 #define __i686__ 1 #define __i386 1 #define __i386__ 1 #define i386 1 (CPU TYPE)
2.檢視原始碼:
Clang and LLVM source code is available for free download from llvm.org. Once
downloaded, OS and processor macros are defined in llvm/tools/clang/lib/Basic/Targets.cpp
.
GCC and G++ source code is available for free download from gnu.org. Once
downloaded, OS and processor macros are defined in gcc/config/*
.
3.類UNIX系統上使用strings命令: strings /usr/bin/gcc 裡面可以獲得預處理巨集定義
測試:在UBUNTU14.04LTS + GCC4.8.2+ intel cpu 環境下,使用命令 strings /usr/bin/gcc 可以得到一些有用的巨集定義值,舉例:
__FILE__ __LINE__ __DATE__ __TIME__ __STDC__ 《C和指標》前處理器章節部分對這幾個巨集定義有詳細介紹
疑問二、How to detect the compiler name and version using compiler predefined macros?
參考這篇文章,裡面相近介紹瞭如何利用巨集定義實現跨編譯器程式碼:http://nadeausoftware.com/articles/2012/10/c_c_tip_how_detect_compiler_name_and_version_using_compiler_predefined_macros
實際使用中跨的比較多的編譯器可能是GNU GCC/G++ 和 MSVC++ ,這種情況下可用下來情況來跨編譯(稍顯不足):
#if defined(__GNUC__)
...
#endif
#if defined(_MSC_VER)
...
#endif
疑問三、How to detect the operating system type using compiler predefined macros?
參考這篇文章,裡面相近介紹瞭如何利用巨集定義實現跨作業系統程式碼,包含各個編譯器下在不同作業系統下針對作業系統而包含的預處理巨集定義:
http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system
筆者使用最多的是LINUX作業系統和WINDOW作業系統 ,若涉及到作業系統的程式設計,用到的巨集定義可以是unix 以及 WIN32.
疑問四、How to detect the processor type using compiler predefined macros?
參考這篇文章,裡面相近介紹了各種CPU型別的巨集定義:
http://nadeausoftware.com/articles/2012/02/c_c_tip_how_detect_processor_type_using_compiler_predefined_macros
如果針對CPU編寫程式碼,可以利用這一部分巨集定義。
疑問五、補充預處理編譯器巨集定義,用於原始碼學習及跨平臺程式碼開發
參考:
http://sourceforge.net/p/predef/wiki/Home/
裡面包含了更多詳細的資料可下載。但資料比較舊,建議查閱各種編譯器的官方文件。