《C程式語言》筆記 十四 參考手冊6

2022-02-02 23:27:42 字數 2656 閱讀 3812

預處理器執行巨集替換 條件編譯以及包含指定的檔案

以#開頭的命令列(#前可以有空格)就是預處理器處理的物件

預處理過程可以劃分為幾個連續的階段

1.將三字串行轉換為等價字元。如果作業系統需要,還要在原始檔的各行之間插入換行符

2.將指令行中位於換行符前的反斜槓\刪除,以把各指令行連線起來

3.將程式分成用空白符分隔的記號,注釋將被替換為乙個空白符。

接著執行預處理指令,並進行巨集替換

4.將字串常量和字串字面量中的轉義字元序列替換為等價字元,然後把相鄰的字串字面值連線起來

5.收集必要的程式和資料,並將外部函式和物件的引用與其定義相連線,翻譯經過以上處理得到的結果,然後與其他程式和庫連線起來

c語言源程式的字符集是7位ascii碼的子集,但它是iso 646-1983不變**集的超集

為了將程式通過這種縮減的字符集表示出來,下列所示的所有三字串行都要用相應的單個字元替換

這種替換在進行所有其他處理之前進行

??=

通過將以反斜槓\結束的指令行末尾的反斜槓和其後的換行符刪除掉,可以將若干指令行合併成一行

這種處理要在分隔記號之前進行

類似於下列形式的控制指令

#define 識別符號 記號序列

將使得預處理器把該識別符號後續出現的各個例項用給定的記號序列替換

記號序列前後的空白符都將被丟棄掉

第二次用#define指令定義同一識別符號是錯誤的

類似於下列形式的識別符號

#define 識別符號(識別符號表) 記號標記

是乙個帶有引數的巨集定義,其中第乙個識別符號與圓括號(之間沒有空格)

同第一種形式一樣,記號序列前後的空白符都將被丟棄。

如果要對巨集進行重定義,則必須保證其引數個數 拼寫及記號序列都與前面的定義相同

#undef

用於取消識別符號的預處理器定義

將#undef應用於未知識別符號並不會導致錯誤

按照第二種形式定義巨集時,識別符號及其後用一對圓括號括起來,由逗號分隔的記號序列就構成了乙個巨集呼叫

巨集呼叫的實際引數是用逗號分隔的記號序列

用引號或巢狀的括號括起來的逗號不能用於實際引數

在處理的過程中,實際引數不進行巨集擴充套件

巨集呼叫時,實際引數的數目必須與定義中形式引數的數目匹配

#include 《檔名》

把該行替換為檔名指定的檔案的內容

#include "檔名"

從原始檔的位置開始搜尋指定檔案,如果沒有找到指定的檔案,則按照第一種方式處理

#include 記號序列

#include 檔案可以巢狀

if行:

#if 常量表示式

#ifdef 識別符號

#ifndef 識別符號

elif部分:

elif行 文字 elif部分

elif行

#elif 常量表示式

else 部分

else 行 文字

else 行

# else

為了便於其他預處理器生成c語言

#line 常量 ' 檔名"

#line 常量

將使編譯器認為:

下一行源**的行號是以十進位制常量的形式給出的

並且,當前的輸入檔案是由該識別符號命名的

#error 記號序列

使預處理器列印包含該記號序列的診斷資訊

#pragma 記號序列

將使預處理器執行乙個與具體實現相關的操作

無法識別pragma將被忽略

#

形式的預處理器將不執行任何操作

某些識別符號是預定義的,擴充套件後將生成特定的資訊

它們同預處理器表示式運算子defined一樣,不能取消定義或重新定義

__line__ 包含當前原始檔函式

__file__ 包含正在編譯的原始檔的字串

__date__ 編譯日期 "mmm dd yyyy"

__time__ 編譯時間 "hh:mm:ss"

__stdc__ 整型常量1

儲存類說明符:one of

auto register static extern typedef

型別說明符:one of

void char short int long float double signed unsigned

型別限定符:one of

const volatile

結構或聯合:one of

struct union

列舉說明符:

enum

常量:整型常量

字元常量

浮點常量

列舉常量

控制指令:

#define 識別符號 記號序列

#define 識別符號 (識別符號表) 記號序列

#undef 識別符號

#include 《檔名》

#include "檔名"

#include 記號序列

#line 常量 "檔名"

#line 常量

#error 記號序列

#pragma 記號序列

《C程式語言》筆記 十一 參考手冊3

運算子的優先順序和結合性有明確的規定 除少數情況外,表示式的求值次序沒有多餘,甚至某些有 的子表示式也沒有第一 也就是說,除非運算子的定義保證了其運算元按某一特定順序求值,否則具體的實現可以自由的選擇任一求值次序,甚至可以改變求值次序 但是,每個運算子將其運算元生成的值結合起來的方式與表示式的語法分...

語言參考手冊

有人都說 比較難,我看不怎麼難 可能就是 語言接觸到的底層太多了,所以感到有點難了,但這也不是什麼壞處,正是體現了 語言的優越之處 我們的許可權更大,寫出的程式在效能上更好!由於這個原因,再加上自己也想有個總結性的 參考手冊,原本打算自己根據 標準 c89 c99 整理一下 語言的,可誰知竟然發現這...

Python 語言參考手冊

本參考手冊描述了 python 的語法和 核心語義 本參考是簡潔的,但試圖做到準確和完整。非必要的內建物件型別和內建函式 模組的語義描述在 python 標準庫 中。有關該語言的非正式介紹,請參閱 python 教程 對 c 或 c 程式設計師,還有兩個額外的手冊 擴充套件和嵌入 python 直譯...