GCC 使用摘记
1. 幾個子程序和說明
2. 幾個重要的和 GCC 協同工作的程序,主要來自 binutils 包。
3. 預處理程序,最常見的 C 使用的預處理命令,如 #define 和#undef,
#if #elif #else #endif,#ifdef 和 #ifndef,#include,##(連接字符)就不多說了。
#error 會引起 cpp 的中斷,而 #warning 僅僅給出警告而不中斷。
#pragma 主要是用于定義編譯器相關的一些命令,GCC 中可用的有
#pragma GCC dependency "file" warning information
定義了該文件對 file 的時間戳依賴關系,即如 file較當前文件新則發出警告。
#pragma GCC poison function-name
如果使用了 function-name 則發出警告。與 #pragma 等價的有_Pragma("")
表達,這是為了在 macro 內部也能使用該功能引入的。
4. 預定義的宏
5. 在 iso646.h 中為操作符定義了 C++ 對應的操作符名稱,如 and,or等
6.產生依賴關系列表,gcc -E -M src
7. GCC 對 C 的擴展主要有,__alignof__( typename )返回對齊信息,可以
使用參數變長數組(在函數里面定義),同時還可以把該數組作為參數傳遞,
void f( int length, char buf[length] )
如果需要倒著寫,需要前向聲明,用分號隔開
void f( int length; char buf[length], int length )
允許結構體最后一個成員為 0 長度數組,這樣可以創建變長數組。
通過 __attribute__ 可以給函數增加額外的信息便于優化,如((noreturn))
表明沒有返回值,又如 pure 表明不會修改全局變量,noinline 表示不會inline,
align(n) 表示執行對齊,weak,alias 連用表示是別名,always_inline表示
總會 inline,const 不訪問全局內存便于優化,constructor 是比 main更早調用
的函數,destructor 是在 exit() 之后調用的,deprecated表示過時了編譯時發出
警告,format( style, str-pos, var-pos ) 要求編譯器檢查是否為style(如 printf 和 scanf)
的函數,str-pos 是字符串參數的位置,var-pos是可變長度參數列表的開始位置。
類似的還有 format_arg。malloc 告訴編譯器其返回指針和 malloc一樣對待,
no_intrument_function 不會進行 profiling,section("sec-name")將代碼放入指定段。
類似的一些可以修飾變量,另有 mode(指定為 byte、word 或者pointer),nocommon
(不會作為公共變量),packed(沒有間隙),vector_size,類似數組。
復合語句 {} 可以返回值,用 () 包裹之,但不適用于 C++。y? y : z可簡寫為 y? : z。
可以對 enum 進行聲明但不定義
另有底層的三個函數,__builtin_apply_args(),__builtin_apply() 和__builtin_return()
可以把當前函數的參數直接傳遞給后面的函數。
而 __builtin_return_address() 返回 ret 時應跳轉的地址(frame中第一個記錄的 %ebp)
__builtin_frame_address( int ) 返回第幾層的 frame 起始地址。
允許函數嵌套定義,并且該函數地址可以傳遞。支持 $ 命名變量名,goto的 label 可以用
&& 取址并賦值給變量進行 goto。__label__ 可以聲明局部標識為goto 使用。只要左值表
達式產生左值(地址)即可。
可變參數宏,c99 標準為使用 ... 和 __VA_ARGS__。
在 switch 中支持 case 1 ... 9 這種表達。支持 typedettypename=var,從而將某變量的類
型定義為需要的類型。typeof(var) 產生 var 的類型。
8. C++ 里面另有 __PRETTY_FUNCTION__,而 #progma interface 和#pragma implementation
可以表示類的性質,另有 >? 和 <?表示返回較大較小的,并可以重載。C99 中 restruct 關鍵字
可以用 __restrict__。
9. C++ 中調用 C 程序只需要 external "C" 聲明即可。而 C 中調用 C++函數也是用 external "c"
聲明函數并用 g++ 編譯。
Tags: gcc
| cc1 | C 的實際編譯程序 |
| cc1plus | C++ 的實際編譯程序 |
| collect2 | 在不使用 GNU連接程序的系統上,用來產生特定的全局初始化代碼 |
| crt0.o | 為每個系統定制的初始化和結束代碼 |
| libgcc | 默認連接的 gcc 例程庫 |
| libstdc++ | 默認連接的 g++ 例程庫 |
2. 幾個重要的和 GCC 協同工作的程序,主要來自 binutils 包。
| addr2line | 將文件中的調試信息翻譯成為源文件的對應行號 |
| ar | 用于維護目標代碼的 archive,也就是創建庫的程序 |
| as | GNU 的匯編器 |
| c++filt | 用于完成 C++ 和 Java 的 mangling/demangling |
| gcov | gprof 的配置工具 |
| gprof | 報告各個函數的執行時間 |
| ld | GNU 的連接程序 |
| nm | 列出目標文件中定義的符號 |
| objcopy | 完成目標代碼的復制和翻譯 |
| objdump | 顯示目標文件的各種信息,包括代碼的反匯編結果 |
| ranlib | 創建和添加 ar 創建的庫文件的索引 |
| readelf | 獲取 elf 文件信息 |
| size | 列出目標文件中每部分的尺寸 |
| strings | 從目標文件中析取可顯示的字符串 |
| strip | 從目標文件/庫中去掉符號表以及其它調試使用的信息 |
3. 預處理程序,最常見的 C 使用的預處理命令,如 #define 和#undef,
#if #elif #else #endif,#ifdef 和 #ifndef,#include,##(連接字符)就不多說了。
#error 會引起 cpp 的中斷,而 #warning 僅僅給出警告而不中斷。
#pragma 主要是用于定義編譯器相關的一些命令,GCC 中可用的有
#pragma GCC dependency "file" warning information
定義了該文件對 file 的時間戳依賴關系,即如 file較當前文件新則發出警告。
#pragma GCC poison function-name
如果使用了 function-name 則發出警告。與 #pragma 等價的有_Pragma("")
表達,這是為了在 macro 內部也能使用該功能引入的。
4. 預定義的宏
| __NASE_FILE__ | 源文件的完整路徑名,和 __FILE__不同,被引用的文件仍然是原來文件名 |
| __CHAR_UNSIGNED__ | 用于指定該機器上 char 是無符號類型 |
| __cplusplus | 使用 C++ 編譯器編譯 |
| __DATE__ | 編譯時的日期 |
| __FILE__ | 編譯文件名 |
| __func__ | 同 __FUNCTION__ |
| __GNUC__ | GCC 的主版本號 |
| __GNUC_MINOR__ | GCC 的次版本號 |
| __GNUC_PATCHLEVEL__ | GCC 的修訂號 |
| __GNUG__ | 由 C++ 編譯程序定義 |
| __INCLUDE_LEVEL__ | 指 #include 的層次 |
| __LINE__ | 當前行號 |
| __NO_INLINE__ | 不允許 inline |
| __OPTIMIZE__ | 打開了優化選項 |
| __OPTIMIZE_SIZE__ | 打開了對編譯出文件尺寸的優化 |
| __STDC__ | 表示該程序符合 ansi C 標準 |
| __STDC_HOSTED__ | 表示宿主具有標準 C 的環境 |
| __STDC_VERSION__ | 標準 C 制定時間 |
| __TIME__ | 編譯時系統時間 |
| __VERSION__ | GCC 版本號 |
5. 在 iso646.h 中為操作符定義了 C++ 對應的操作符名稱,如 and,or等
6.產生依賴關系列表,gcc -E -M src
7. GCC 對 C 的擴展主要有,__alignof__( typename )返回對齊信息,可以
使用參數變長數組(在函數里面定義),同時還可以把該數組作為參數傳遞,
void f( int length, char buf[length] )
如果需要倒著寫,需要前向聲明,用分號隔開
void f( int length; char buf[length], int length )
允許結構體最后一個成員為 0 長度數組,這樣可以創建變長數組。
通過 __attribute__ 可以給函數增加額外的信息便于優化,如((noreturn))
表明沒有返回值,又如 pure 表明不會修改全局變量,noinline 表示不會inline,
align(n) 表示執行對齊,weak,alias 連用表示是別名,always_inline表示
總會 inline,const 不訪問全局內存便于優化,constructor 是比 main更早調用
的函數,destructor 是在 exit() 之后調用的,deprecated表示過時了編譯時發出
警告,format( style, str-pos, var-pos ) 要求編譯器檢查是否為style(如 printf 和 scanf)
的函數,str-pos 是字符串參數的位置,var-pos是可變長度參數列表的開始位置。
類似的還有 format_arg。malloc 告訴編譯器其返回指針和 malloc一樣對待,
no_intrument_function 不會進行 profiling,section("sec-name")將代碼放入指定段。
類似的一些可以修飾變量,另有 mode(指定為 byte、word 或者pointer),nocommon
(不會作為公共變量),packed(沒有間隙),vector_size,類似數組。
復合語句 {} 可以返回值,用 () 包裹之,但不適用于 C++。y? y : z可簡寫為 y? : z。
可以對 enum 進行聲明但不定義
另有底層的三個函數,__builtin_apply_args(),__builtin_apply() 和__builtin_return()
可以把當前函數的參數直接傳遞給后面的函數。
而 __builtin_return_address() 返回 ret 時應跳轉的地址(frame中第一個記錄的 %ebp)
__builtin_frame_address( int ) 返回第幾層的 frame 起始地址。
允許函數嵌套定義,并且該函數地址可以傳遞。支持 $ 命名變量名,goto的 label 可以用
&& 取址并賦值給變量進行 goto。__label__ 可以聲明局部標識為goto 使用。只要左值表
達式產生左值(地址)即可。
可變參數宏,c99 標準為使用 ... 和 __VA_ARGS__。
在 switch 中支持 case 1 ... 9 這種表達。支持 typedettypename=var,從而將某變量的類
型定義為需要的類型。typeof(var) 產生 var 的類型。
8. C++ 里面另有 __PRETTY_FUNCTION__,而 #progma interface 和#pragma implementation
可以表示類的性質,另有 >? 和 <?表示返回較大較小的,并可以重載。C99 中 restruct 關鍵字
可以用 __restrict__。
9. C++ 中調用 C 程序只需要 external "C" 聲明即可。而 C 中調用 C++函數也是用 external "c"
聲明函數并用 g++ 編譯。
Tags: gcc
總結
- 上一篇: 领导者/追随者(Leader/Follo
- 下一篇: ssh防止连接掉线