C 語言複習與提高— VI. 編譯預先處理

來源:互聯網
上載者:User
VI. 編譯預先處理

編譯預先處理是指在對程式進行編譯之前所做的預加工處理,此工作在對每一個程式進行編譯時間都自動進行。

一、ANSI C 定義的標準預先處理指令:

#if

#ifdef

#ifndef

#else

#elif

#endif

#define

#undef

#line

#error

#pragma

#include

前置處理器處理的對象是預先處理指令(preprocessor directives),輸出是“翻譯單元”(是存放在記憶體中的臨時檔案)。

編譯器接受前置處理器的輸出,並把原始碼轉換成包含機器語言指令的目標檔案。

二、書寫規定與習慣:

1、每條指令必須單獨佔用一行。

2、每行末尾不加 ;(因為不是語句)。

3、一般使用全部大寫來表示標識符。如: #define LANGUAGE chinese

4、一個預先處理指令可以寫在程式中的任何位置。通過合理地使用這些指令,可以提高程式的可讀性和可移植性。

三、關於 #define 的一些說明:

1、宏中的參數只原樣替換,並不求值,而函數的參數則不然。

2、宏中的參數不會被分配記憶體空間。

3、宏只佔用編譯時間,而不佔用已耗用時間,但函數則相反。

4、宏被替換後,可能使代碼加長,而函數則不會。使用函數的一個主要目的就是是代碼可以重用,起到簡化代碼的作用。

5、宏比函數具有更好的資料類型的適應性(因為它沒有參數類型的要求)。

6、宏不能遞迴調用。

使用類函數宏代替函數的一個主要的優點是能夠提高代碼的速度(消除了調用的開銷)。但是,若類函數宏的尺寸非常大,則會因為複製代碼而增加了程式的規模。所以,在 C99 和 C++ 中,定義了 inline 關鍵字,使程式員能夠更好地定義內聯代碼。

四、關於 #include 的一些說明:

1、檔案包含是一種模組化程式的手段,有助於代碼的重用。

2、習慣:程式員可將經常使用的常量(宏定義)、多個源檔案共同使用的全域變數、函式宣告等寫成一個或分類寫成多個檔案,在需要時,可以用 #include 將它(們)包含進來。

3、包含檔案中允許嵌套包含(可以包含其它 #include 指令)。允許的最大嵌套深度隨編譯器的不同而不同。C89 規定編譯器最少應能處理 8 層嵌套包含,C99 提升到 15 層。

五、關於條件編譯的一些說明:

1、條件編譯是為了使商業軟體具有更廣泛的適應性(或可移植性)而提供的功能。

2、C89 規定,#if -- #elif、#ifdef 和 #ifndef 的嵌套深度最少為 8 層,C99 提升至 63 層。

3、[執行個體1] #ifdef IBM-PC #define INTSIZE 2 #else #define INTSIZE 4 #endif

[執行個體2]符號 NULL 在 6 個不同的檔案中都有定義:locate.h、stddef.h、stdio.h、stdlib.h、string.h、time.h。一個源檔案可能包含其中的幾個標頭檔,這樣會使編譯器報錯。這時需要在每個標頭檔中使用條件編譯: #ifndef NULL #define NULL ((void *)0) #endif

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.