一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看

C語(yǔ)言

C語(yǔ)言預處理的相關(guān)知識

時(shí)間:2025-03-22 02:15:20 C語(yǔ)言 我要投稿
  • 相關(guān)推薦

C語(yǔ)言預處理的相關(guān)知識

  導語(yǔ):在C語(yǔ)言編譯的時(shí)候,會(huì )經(jīng)歷以下幾個(gè)步驟:預處理,編譯,匯編,鏈接,然后生成可執行文件。整個(gè)過(guò)程是一連串動(dòng)作完成的。而預處理階段呢,也是在最先執行的一個(gè)步驟。相對來(lái)說(shuō),也是比較重要的一個(gè)步驟。那么C語(yǔ)言預處理的相關(guān)知識呢?一起來(lái)學(xué)習下吧:

C語(yǔ)言預處理的相關(guān)知識

  概念: 以“#”號開(kāi)頭的預處理指令如包含#include,宏定義制定#define等,在源程序中這些指令都放在函數之外,而且一般放在源文件的前面 ,所謂預處理其實(shí)就是在編譯的第一遍掃描之前的所作的工作,預處理是c語(yǔ)言的一個(gè)重要的功能,它由預處理程序單獨完成,當對一個(gè)源文件進(jìn)行編譯時(shí),系統自動(dòng)引用預處理程序,預處理在 源代碼編譯之前對其進(jìn)行的一些文本性質(zhì)的操作,對源程序編譯之前做一些處理,生成擴展的C源程序

  預處理階段做了任務(wù):

  1:將頭文件中的內容(源文件之外的文件)插入到源文件中

  2:進(jìn)行了宏替換的過(guò)程,定義和替換了由#define指令定義的符號

  3:刪除掉注釋的過(guò)程,注釋是不會(huì )帶入到編譯階段

  4:條件編譯

  預處理指令:

  gcc -E bin/helloworld.i src/helloworld.c

  預處理生成的是.i的文本文件,這個(gè)文本文件是可以直接通過(guò)cat命令進(jìn)行文本文件查看的

  宏定義

  在C語(yǔ)言中允許用一個(gè)標識符來(lái)表示一個(gè)字符串;稱(chēng)為宏,在預處理時(shí),對程序的宏進(jìn)行替換,其中宏定義是由源程序中的#define來(lái)完成 ,而宏的替換,主要是由預處理程序完成的

  #define PI 3.1415

  宏定義的規則:

  #表示一條預處理的指令,以#開(kāi)頭的均是預處理指令

  #define是宏定義的指令,標識符是所定義的宏名

  宏名一般都是大寫(xiě)的字母表示,以便和變量名區別

  宏定義其實(shí)并不是C語(yǔ)言的語(yǔ)句,所以后面是不用去加;號

  宏體可以是常數,表達式,格式化字符串等,為表達式的時(shí)候應該用括號闊起來(lái)

  宏替換不分配內存空間,也不做正確性的檢查

  宏的范圍是從定義后到本源文件的結束,但是可以通過(guò)#undef來(lái)進(jìn)行提前取消

  宏定義分為有參宏定義和無(wú)參宏定義:

  無(wú)參宏定義:

  語(yǔ)法:

  #define 標識符(宏名)[字符串]

  宏體可缺。

  #define YES 1

  #define NO 0

  #define OUT printf("Hello world")

  #define WIDTH 80

  #define LENGTH (WIDTH+40)

  宏的移除語(yǔ)法

  #undef 宏名

  功能:刪除前面定義的宏

  事例:

  #undef PI

  #undef OUT

  #undef YES

  #undef NO

  帶參宏定義:

  帶參宏定義的語(yǔ)法結構

  #define 宏名(形參列表) 字符串(宏體)

  帶參數宏定義調用:

  宏名(實(shí)參表);

  C語(yǔ)言中允許宏帶有參數,在宏定義的參數中稱(chēng)為形式參數,形式參數不分配內存單元,沒(méi)有類(lèi)型定義;

  #define S(a,b) a*b;

  area = S(3,2);

  宏展開(kāi) area = 3 * 2;

  注意事項:

  帶參數宏定義中,宏名和形式參數列表之間不能有空格出現。如

  #define MAX (a,b) (a>b)?a:b

  此時(shí)MAX為無(wú)參的宏定義,宏體為(a,b) (a>b)?a:b

  #define MAX(a,b) (a>b)?a:b

  宏定義中,形參是一個(gè)標識符,而宏調用的參數可以是一個(gè)表達式

  宏體內的形參通常要括號闊起來(lái)

  #define POWER(x) ((x)*(x))

  條件編譯

  條件編譯的概念

  1:一般情況下,源程序中所有的行都進(jìn)行編譯,但是有時(shí)希望對其中一部分內容滿(mǎn)足一定條件下才進(jìn)行編譯,也就是對一部分內容指定編譯條件,這就是條件編譯

  條件編譯的優(yōu)點(diǎn)

  條件編譯可以指定代碼的一部分是被正常編譯還是被完全忽略

  條件編譯有利于提升程序的可移植性,增強程序 的靈活性

  條件編譯的相關(guān)語(yǔ)法

  條件編譯語(yǔ)法一:

  #ifdef 標識符(宏名) //或者#if define(標識符)

  程序段1

  #else

  程序段2

  #endif

  實(shí)例代碼:防止多重包含的問(wèn)題產(chǎn)生

  #define HELLO "helloworld"

  #ifdef HELLO

  #define HI "welcome"

  #endif

  條件編譯語(yǔ)法二:

  #ifndef 標識符(宏名) //或#if !define(標識符)

  程序段1

  #else

  程序段2

  #endif

  實(shí)例:

  #ifndef __HELLO_H__

  #define __HELLO_H__

  void out();

  #else

  //程序段2

  #endif

  條件編譯語(yǔ)法三:

  #if(常量表達式)

  程序段1

  #elif(常量表達式2)

  程序段2

  #else

  程序段3

  #endif

  實(shí)例代碼:

  #define C1 0

  #define C2 0

  #define C3 1

  #if(C1)

  #include "c1.h"

  #elif(C2)

  #include "c2.h"

  #elif(C3)

  #include "c3.h"

  #else

  #include "c.h"

  #endif

  文件包含

  文件包含的概念

  文件包含是C預處理程序的另一個(gè)重要的功能,被包含的文件名字必須使用雙引號”“(自定義頭文件),或者<>(標準庫文件)括起來(lái),

  文件包含的語(yǔ)法:

  #include <文件名>

  或者

  #include "文件名"

  文件包含的功能:

  一個(gè)源文件可以將另外一個(gè)源文件的內容包含進(jìn)來(lái),從而把指定的文件和當前的源文件連成一個(gè)源文件

  文件包含的處理過(guò)程:

  在預處理的時(shí)候,用被包含文件的內容取代該文件包含指令,再對包含后的文件作一個(gè)源文件編譯

  文件包含的搜索方式

  #include<文件名>

  若指定文件目錄(如include)則會(huì )從指定目錄中去進(jìn)行查找,否則就會(huì )按照標準的方式進(jìn)行查找

  如:(gcc -o bin/hello -Iinclude src/hello)

  標準方式:從系統標準文件所在的目錄中去尋找要包含的文件

  linux下:/usr/include或者/usr/lib中主要存放的是標準庫文件

  #include "文件名"

  先從存放C源文件的目錄中查找,然后從指定的目錄中去查找,最后再從C語(yǔ)言的標準庫文件中去查找

  重要:文件的多重包含問(wèn)題

  概念:同一個(gè)文件被包含了多次

  結果:多重包含可能會(huì )出現重復定義的編譯錯誤

  解決方式:使用條件編譯(只能是一個(gè)源文件中去解決)來(lái)防止多重包含,凡是在頭文件前后,用條件編譯去編譯

  如標準頭文件的寫(xiě)法:

  #ifndef __HEADER_NAME_H__

  #define __HEADER_NAME_H__

  #include "headername.h"

  //其他的代碼

  #endif

  如果在多個(gè)源文件中進(jìn)行多重包含的話(huà),使用多重包含的話(huà)是解決不了的。需要檢查。

  建議注意:

  在頭文件中盡量不要去定義一些全局變量,可以在源文件中去定義,用extern去修飾,將變量的作用于釋放帶整個(gè)程序

  預處理操作符和預定義宏

  預處理操作符號:#和##

  C語(yǔ)言中有兩個(gè)預處理操作符號#和##,它可以在#define中使用

  操作符號#通常成為字符串化的操作符號,它把其后的串變成用雙引號包圍的串

  如:#define PRINT(FORMAT,VALUE) printf("the value of" #value "is" FORMAT " ",VALUE)

  PRINT("%d",x+3);

  連接操作符號##可以把兩個(gè)獨立的字符串鏈接成一個(gè)字符串

  如:

  #define ADD_TO_SUM(sum_number,value) sum##sum_number +=value

  ADD_TO_SUM(5,25);

  預定義宏和其他指令:

  __FILE__ 進(jìn)行編譯的源文件名稱(chēng)

  __LINE__ 文件當前的行號

  __DATE__文件被編譯的日期

  __TIME__文件被編譯的時(shí)間

  __fun__當前所在的函數名稱(chēng)

  其他預處理

  #error 自定義輸出的錯誤,是不能鏈接生成可執行文件的

  #line 設置當前的文件從哪一行開(kāi)始計算

  #line 100 "hello.c"

  #pragma 字節對齊預處理指令

  #pragma message("helloworld");----->輸出提示相關(guān)信息

  以上是個(gè)人在學(xué)習過(guò)程中所做的一些總結性東西,如有不對的地方,希望可以及時(shí)指出,歡迎繼續訪(fǎng)問(wèn)。


一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看