glibc標頭檔案和巨集定義

2022-07-18 04:24:11 字數 1812 閱讀 5602

標頭檔案沒啥好說的,無非就是" "和< >的區別,這估計只要是學過c/c++的人都明白。現在的編譯器對頭檔案的包含順序沒有要求,但老的c實現則不一樣。當然,我們現在無需關心標頭檔案順序了。

我們為啥要包含標頭檔案呢?標頭檔案裡面有定義嘛,使用任何函式之前都必須定義該函式。所以我們並不強求包含標頭檔案,只要你自己在庫函式使用之前定義該函式,有些編譯器還會自動的新增標準庫定義。但是吶,我們還是推薦將標頭檔案新增上去,標頭檔案裡面有時候還會包含型別定義、常量定義、巨集定義。

在linux環境下,gcc會在以下路徑中查詢標頭檔案:/usr/local/include;libdir/gcc/target/version/include;/usr/target/include;/usr/include。c++程式還會查詢libdir/../include/c++/version。target是乙個標準名指的是你的gcc編譯的目錄。version則是版本號了。

gcc可以使用-idir引數指定頭檔案目錄。-nostdinc選項則會阻止gcc搜尋某個頭檔案目錄。-nostdinc在編譯系統核心的時候會很有用,因為系統核心不使用標準c庫,核心使用的是原始碼裡面自帶的庫檔案。注意:-nostdinc對-idir無效。

我們可以在gcc -i選項引數的任意位置放置-i-標誌,在-i-標誌之前的目錄我們只查詢由引號標記的標頭檔案,-i-標記之後的目錄則查詢所有標頭檔案。你要是想指定查詢由引號標記的頭檔案目錄,我們不推薦使用-i-標記,而是使用用-iquote選項。

如果很不幸,你有乙個目錄叫"-"。這種情況下你得使用-i./- 和-i-區別開來。

為了防止標頭檔案被包含多次,你需要使用巨集的條件語句:

/*

file foo.

*/#ifndef file_foo_seen

#define file_foo_seen

/**the entire file

*/#endif /*!file_foo_seen*/

一般在系統標頭檔案中像file_foo_seen這種巨集名以「__」開頭,所以在個人標頭檔案中建議使用「_」開頭,以防衝突。

c++中我們有兩種方式防止標頭檔案被重複包含,但我們都不推薦使用。

一、#import

#import實際上來自於objective-c的標準做法,是#include的乙個變種。#import包含標頭檔案,但最多隻包含一次。我們不推薦的理由是:#import放權給了使用者,使用者必須知道乙個標頭檔案必須只包含一次。但我們的宗旨是把這一任務交給標頭檔案來完成。

二、#pragma once

#pragma once 指令使用在標頭檔案裡面,符合我們的宗旨。但是並不是所有的預處理器都能識別該指令。如果考慮可移植性,該指令顯然是要移除的。

在預處理過程中,預處理器會告訴編譯器標記符號的位置,實際上就是哪個檔案哪一行。編譯出錯的時候編譯器往往會有提示,告訴你錯誤可能在那個檔案哪一行。這是通過語法解析器在解析**的時候自動插入的$line 巨集

在glibc中有的函式可能只是乙個巨集定義,也可能是乙個實實在在的函式。這對我們的程式沒什麼影響。使用巨集定義函式的理由是:可以產生內聯擴充套件,這要比函式呼叫快的多,缺點是不易於debug(原因是編譯器給出的行號不是巨集展開的地方,而是巨集定義的地方)。基於巨集定義函式的缺點,你可能想避免使用巨集定義函式。你有兩種方式來避免:

1、給函式名新增括號

2、使用#undef預處理指令

比如abs函式,既有巨集定義也有函式實現。

#include abs(i);     

//根據編譯器選擇可能是巨集,也可能是函式呼叫

(abs)(i); //

一定是函式呼叫

#undef absabs(i);

//一定是函式呼叫

MFC中標頭檔案和預定義巨集

包括了標頭檔案stdafx.h。在生成預編譯標頭檔案pch的時候,首先要開啟afxwin.h,然後才能開啟本檔案。4.連線資源 include resource.h main symbols 標頭檔案resource.h是專案中windows資源 與可執行 的唯一介面檔案。5.為除錯版本新增診斷服務...

systemcall標頭檔案巨集值定義

long syscall longnumber,syscall的第乙個引數number根據例子程式都是使用sys 定義的呢?根據man 2 syscall可以看到number是使用的 include 標頭檔案,裡面又 include 和 include 其中asm unistd.h裡面根據平台不同最...

關於巨集定義,常見巨集及其對應的標頭檔案

1 ifndef和 define組合 一般用於標頭檔案中,防止該標頭檔案被重複引用.其用法一般為 ifndef 標識 define 標識 include or define sth.else endif 標識 在理論上來說可以是自由命名的,但每個標頭檔案的這個 標識 都應該是唯一的。標識的命名規則一...