筆記 C 預處理命令

2021-05-28 07:55:02 字數 4857 閱讀 6036

預處理命令是提供給編譯器使用的,在對**進行編譯之前,先對預處理命令進行操作:

主要包括:檔案引入#include,新的引入標頭檔案不再加".h";

巨集定義#define

編譯選擇,如#ifdef ,#else,#endif等。

1.(預編譯頭機制)

vc.net 預設情況下使用預編譯頭(/yu),不明白的在加入新.h檔案後編譯時總出現fatal error c1010: 在查詢預編譯頭指令時遇到意外的檔案結尾的錯誤。解決方法是在include標頭檔案的地方加上#include "stdafx.h",或者打專案屬性,找到「c/c++」資料夾,單擊「預編譯頭」屬性頁。修改「建立/使用預編譯頭」屬性為「不使用預編譯頭」。

2.預定義識別符號

為了處理一些有用的資訊,預處理定義了一些預處理識別符號,雖然各種編譯器的預處理識別符號不盡相同,但是他們都會處理下面的4種:

__file__ 正在編譯的檔案的名字

__line__ 正在編譯的檔案的行號

__date__ 編譯時刻的日期字串,例如: "25 jan 2006"

__time__ 編譯時刻的時間字串,例如: "12:30:55"

例如:cout<<"the file is :"<<__file__"<<"! the lines is:"<<__line__<

3.c/c++標頭檔案一覽

c、傳統 c++

#include //設定插入點

#include //字元處理

#include //定義錯誤碼

#include //浮點數處理

#include //檔案輸入/輸出

#include //引數化輸入/輸出

#include //資料流輸入/輸出

#include //定義各種資料型別最值常量

#include //定義本地化函式

#include //定義數學函式

#include //定義輸入/輸出函式

#include //定義雜項函式及記憶體分配函式

#include //字串處理

#include //基於陣列的輸入/輸出

#include //定義關於時間的函式

#include //寬字元處理及輸入/輸出

#include //寬字元分類

標準 c++ (同上的不再注釋)

#include //stl 通用演算法

#include //stl 位集容器

#include

#include

#include

#include

#include //複數類

#include

#include

#include

#include

#include //stl 雙端佇列容器

#include //異常處理類

#include

#include //stl 定義運算函式(代替運算子)

#include

#include //stl 線性列表容器

#include //stl 對映容器

#include

#include //基本輸入/輸出支援

#include //輸入/輸出系統使用的前置宣告

#include

#include //基本輸入流

#include //基本輸出流

#include //stl 佇列容器

#include //stl 集合容器

#include //基於字串的流

#include //stl 堆疊容器    

#include //標準異常類

#include //底層輸入/輸出支援

#include //字串類

#include //stl 通用模板類

#include //stl 動態陣列容器

#include

#include

using namespace std;

c99 增加

#include //複數處理

#include //浮點環境

#include //整數格式轉換

#include //布林環境

#include //整型環境

#include //通用型別數學巨集

4.編譯控制指令

這些指令的主要目的是進行編譯時進行有選擇的挑選,注釋掉一些指定的**,以達到版本控制、防止對檔案重複包含的功能。使用格式,如下:

1、如果identifier為乙個定義了的符號,your code就會被編譯,否則剔除。

#ifdef identifier

your code

#endif

2、如果identifier為乙個未定義的符號,your code就會被編譯,否則剔除。

#ifndef identifier

your code

#endif

3、如果expression非零,your code就會被編譯,否則剔除。

#if expression

your code

#endif

4、如果identifier為乙個定義了的符號,your code1就會被編譯,否則your code2就會被編譯。

#ifdef identifier

your code1

#else

your code2

#endif

5、如果epression1非零,就編譯your code1,否則,如果expression2非零,就編譯your code2,否則,就編譯your code3。

#if expressin1

your code1

#elif expression2

your code2

#else

your code3

#enif

其他預編譯指令除了上面我們說的集中常用的編譯指令,還有3種不太常見的編譯指令:#line、#error、#pragma,我們接下來就簡單的談一下。

#line的語法如下:

#line number filename

例如:#line 30 a.h

其 中,檔名a.h可以省略不寫。這條指令可以改變當前的行號和檔名,例如上面的這條預處理指令就可以改變當前的行號為30,檔名是a.h。初看起來似 乎沒有什麼用,不過,他還是有點用的,那就是用在編譯器的編寫中,我們知道編譯器對c++原始碼編譯過程中會產生一些中間檔案,通過這條指令,可以保證檔案 名是固定的,不會被這些中間檔案代替,有利於進行分析。

#error語法如下:

#error info

例如:#ifndef unix

#error this software requires the unix os.

#endif

這條指令主要是給出錯誤資訊,上面的這個例子就是,如果沒有在unix環境下,就會輸出this software requires the unix os.然後誘發編譯器終止。所以總的來說,這條指令的目的就是在程式崩潰之前能夠給出一定的資訊。

#pragma是非統一的,他要依靠各個編譯器生產者。例如vc++中:

#pragma comment(lib,"dlltest.lib")

導入庫dlltest.lib。

注:預編譯頭機制

這裡介紹vc6的預編譯功能的使用,由於預編譯詳細使用比較的複雜,這裡只介紹幾個最重要的預編譯指令: /yu, /yc,/yx,/fp。其它的詳細資料可以參考:

msdn -> visual studio 6.0 document -> visual c++ 6.0 document -> vc++ programmer guider -> compiler and linker -> details -> creating precompiled header files

預編譯頭的概念:

#include // mfc core and standard components

#include // mfc extensions

#include // mfc automation classes

#include // mfc support for internet explorer 4 common controls

#include

這些正是使用mfc的必須包含的標頭檔案,當然我們不太可能在我們的工程中修改這些標頭檔案的,所以說他們是穩定的。

那 麼我們如何指定它來生成預編譯標頭檔案。我們知道乙個標頭檔案是不能編譯的。所以我們還需要乙個cpp檔案來生成.pch 檔案。這個檔案預設的就是stdafx.cpp。在這個檔案裡只有一句**就是:#include 「stdafx.h」。原因是理所當然的,我們僅僅是要它能夠編譯而已―――也就是說,要的只是它的.cpp的副檔名。我們可以用/yc編譯開關來指定 stdafx.cpp來生成乙個.pch檔案,通過/fp編譯開關來指定生成的pch檔案的名字。開啟project ->setting->c/c++ 對話方塊。把category指向precompiled header。在左邊的樹形檢視裡選擇整個工程。

我們可以使用預編譯頭功能了。以下是注意事項:

1):如果使用了/yu,就是 說使用了預編譯,我們在每個.cpp檔案的最開頭,我強調一遍是最開頭,包含你指定產生pch檔案的.h檔案(預設是stdafx.h)不然就會有問題。 如果你沒有包含這個檔案,就告訴你unexpected file end. 如果你不是在最開頭包含的,你自己試以下就知道了,絕對有很驚人的效果。

2) 如果你把pch檔案不小心丟了,根據以上的分析,你只要讓編譯器生成乙個pch檔案就可以了。也就是說把 stdafx.cpp(即指定/yc的那個cpp檔案)重新編譯一遍就可以了。當然你可以傻傻的 rebuild all。簡單一點就是選擇那個cpp檔案,按一下ctrl + f7就可以了。

C 筆記整理 預處理命令

define和 undef define 它告訴編譯器存在給定名稱的符號 undef 它刪除符號的定義 if elif else endif 這些指令告訴編譯器是否編譯某個 塊 define debug define bug static void main string args if if el...

c 預處理和預處理命令

預處理發生在編譯之前,預處理輸出的是乙個單一的檔案,這個檔案被送到編譯器,進行編譯。每條預處理命令都控制預處理器的行為。每條預處理命令佔據一行,有以下的格式 character 預處理命令 one of define,undef,include,if,ifdef,ifndef,else,elif,e...

C 預處理命令

c 提供的預處理功能 巨集定義 檔案包含和條件編譯 分別由巨集定義命令 檔案包含命令和條件編譯命令三種預處理命令來實現。預處理命令 格 式 預處理命令 末尾不加分號 作用域 從定義點到程式結束 說 明 預處理命令獨佔一行,位置任意 巨集定義命令 格 式 define 巨集名 形參 巨集體 undef...