C/C++編程筆記:C語言預處理命令是什麼?不要覺得你直接寫#就行!

不少小夥伴在本身寫代碼的時候,已經屢次使用過#include命令。使用庫函數以前,應該用#include引入對應的頭文件。其實這種以#號開頭的命令稱爲預處理命令。linux

C語言源文件要通過編譯、連接才能生成可執行程序:編程

1) 編譯(Compile)會將源文件(.c文件)轉換爲目標文件。對於 VC/VS,目標文件後綴爲.obj;對於GCC,目標文件後綴爲.o。windows

編譯是針對單個源文件的,一次編譯操做只能編譯一個源文件,若是程序中有多個源文件,就須要屢次編譯操做。微信

2) 連接(Link)是針對多個文件的,它會將編譯生成的多個目標文件以及系統中的庫、組件等合併成一個可執行程序。編輯器

關於編譯和連接的過程、目標文件和可執行文件的結構、.h 文件和 .c 文件的區別,咱們將在後期專題中講解。模塊化

在實際開發中,有時候在編譯以前還須要對源文件進行簡單的處理。例如,咱們但願本身的程序在 Windows 和 Linux 下都可以運行,那麼就要在 Windows 下使用 VS 編譯一遍,而後在 Linux 下使用 GCC 編譯一遍。可是如今有個問題,程序中要實現的某個功能在 VS 和 GCC 下使用的函數不一樣(假設 VS 下使用 a(),GCC 下使用 b()),VS 下的函數在 GCC 下不能編譯經過,GCC 下的函數在 VS 下也不能編譯經過,怎麼辦呢?函數

這就須要在編譯以前先對源文件進行處理:若是檢測到是 VS,就保留 a() 刪除 b();若是檢測到是 GCC,就保留 b() 刪除 a()。學習

這些在編譯以前對源文件進行簡單加工的過程,就稱爲預處理(即預先處理、提早處理)。spa

預處理主要是處理以#開頭的命令,例如#include <stdio.h>等。預處理命令要放在全部函數以外,並且通常都放在源文件的前面。.net

預處理是C語言的一個重要功能,由預處理程序完成。當對一個源文件進行編譯時,系統將自動調用預處理程序對源程序中的預處理部分做處理,處理完畢自動進入對源程序的編譯。

編譯器會將預處理的結果保存到和源文件同名的.i文件中,例如 main.c 的預處理結果在 main.i 中。和.c同樣,.i也是文本文件,能夠用編輯器打開直接查看內容。

C語言提供了多種預處理功能,如宏定義、文件包含、條件編譯等,合理地使用它們會使編寫的程序便於閱讀、修改、移植和調試,也有利於模塊化程序設計。

實例

下面咱們舉個例子來講明預處理命令的實際用途。假如如今要開發一個C語言程序,讓它暫停 5 秒之後再輸出內容,而且要求跨平臺,在 Windows 和 Linux 下都能運行,怎麼辦呢?

這個程序的難點在於,不一樣平臺下的暫停函數和頭文件都不同:

Windows 平臺下的暫停函數的原型是void Sleep(DWORD dwMilliseconds)(注意 S 是大寫的),參數的單位是「毫秒」,位於  頭文件。

Linux 平臺下暫停函數的原型是unsigned int sleep (unsigned int seconds),參數的單位是「秒」,位於  頭文件。

不一樣的平臺下必須調用不一樣的函數,並引入不一樣的頭文件,不然就會致使編譯錯誤,由於 Windows 平臺下沒有 sleep() 函數,也沒有 <unistd.h> 頭文件,反之亦然。這就要求咱們在編譯以前,也就是預處理階段來解決這個問題。請看下面的代碼:

    #include<stdio.h>

    //不一樣的平臺下引入不一樣的頭文件

    #if_WIN32//識別windows平臺

    #include<windows.h>

    #elif__linux__//識別linux平臺

    #include<unistd.h>

    #endif

    intmain(){

    //不一樣的平臺下調用不一樣的函數

        #if_WIN32//識別windows平臺

    Sleep(5000);

        #elif__linux__//識別linux平臺

    sleep(5);

        #endif

    puts("http://c.biancheng.net/");

    return0;

    }

 

#if、#elif、#endif 就是預處理命令,它們都是在編譯以前由預處理程序來執行的。這裏咱們不討論細節,只從總體上來理解。

對於 Windows 平臺,預處理之後的代碼變成:

 

    #include<stdio.h>
#include
<windows.h> intmain(){ Sleep(5000); puts("http://c.biancheng.net/"); return0; } 對於 Linux 平臺,預處理之後的代碼變成: #include<stdio.h> #include<unistd.h> intmain(){ sleep(5); puts("http://c.biancheng.net/"); return0; }

你看,在不一樣的平臺下,編譯以前(預處理以後)的源代碼都是不同的。這就是預處理階段的工做,它把代碼當成普通文本,根據設定的條件進行一些簡單的文本替換,將替換之後的結果再交給編譯器處理。

如今,你懂了嗎?

微信公衆號:C語言編程學習基地,學習C/C++編程知識,歡迎關注筆者哦~

其實作爲一個編程學習者,有一個學習的氛圍跟一個交流圈子特別重要這裏我推薦一個C語言C++交流Q羣1108152000,無論你是小白仍是轉行人士歡迎入駐,你們一塊兒交流成長。

相關文章
相關標籤/搜索