日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GCC 使用摘记

發布時間:2023/12/10 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GCC 使用摘记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 幾個子程序和說明
cc1C 的實際編譯程序
cc1plusC++ 的實際編譯程序
collect2在不使用 GNU連接程序的系統上,用來產生特定的全局初始化代碼
crt0.o為每個系統定制的初始化和結束代碼
libgcc默認連接的 gcc 例程庫
libstdc++默認連接的 g++ 例程庫


2. 幾個重要的和 GCC 協同工作的程序,主要來自 binutils 包。
addr2line將文件中的調試信息翻譯成為源文件的對應行號
ar用于維護目標代碼的 archive,也就是創建庫的程序
asGNU 的匯編器
c++filt用于完成 C++ 和 Java 的 mangling/demangling
gcovgprof 的配置工具
gprof報告各個函數的執行時間
ldGNU 的連接程序
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

總結

以上是生活随笔為你收集整理的GCC 使用摘记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。