一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - 簡介C/C++預處理器的一些工作

簡介C/C++預處理器的一些工作

2021-03-02 14:08C語言教程網 C/C++

這篇文章主要介紹了C/C++預處理器的一些工作,有助于理解編譯器底層的工作流程,需要的朋友可以參考下

多么令人愉快的一個問題啊

就在被帶到編譯器那里之前,預處理器都會對你的源代碼瞧上一瞧, 做一些格式化的工作,并執行任何你在源代碼里面留給它來執行的指令.

像什么?

好吧,預處理器的指令就被叫做預處理器指令,而他們都以一個#開頭.

像 #include 這樣?

正確.

每一個被預處理器遇到的 # 命令都會導致在某種方式上對源代碼的修改. 讓我們來簡單的研究研究它們,然后我們就會之后這背后都是怎么運轉的了.

#include

包含其他庫、類、接口等的頭文件。預處理器實際上就只是把整個頭文件復制到你的源代碼里面 (是的,這就是包含防御之所以是件好事的原因了).
#define

誰會不喜歡宏呢! 預處理器會把所有定義的實體替換成被定義的代碼. 定義會一直持續直到發現這個定義的 #undef 指令.
#ifdef

條件行為告訴預處理器包含在遇到聲明的條件成立的條件塊中的代碼. 你可以就像if-else語句一樣使用它們,從這里面選擇: #ifdef, #ifndef, #if, #else, 以及 #elif, 而你總是要使用一個 #endif 作為結束。

#error #warning

用來向用戶發送消息。預處理器會在 #error 處, 而不會在 #warning 處停下來. 兩種情況下他都會發送他在指令背后(的括號里面)發現的字符串, 發送到屏幕作為輸出,因此它是一種確保針對你的平臺一切OK的手動方式.
#line

用來在你遇到編譯錯誤時修改顯示的錯誤行號和文件名. 例如,加入你需要查看一個來自編譯的中間文件的源文件(可能是自動生成的).
#pragma

其它由編譯器解釋的特殊指令。你的編譯器文檔會告訴你指令是怎么用的,而你不要假定他們在全世界都通用哦.

#assert #unassert

這些在老程序里面總是特別受歡迎的 (好吧,只要我也曾經為這樣一個程序工作過), 但是它們在現在已經過時了。強烈建議不使用它們,這意味著不要把他們放到新的代碼里面
預定義宏

有許多可以利用的預定義宏:

__FILE__ 給出一個字符串的文件名
__LINE__  給出當前的行號(整型)
__DATE__ 當前編譯日期的字符串
__TIME__ 當前編譯時間的字符串
__STDC__ 同編譯器相關的,但常常被定義成1,以聲明同ISO C標準兼容.
__cplusplus 在編譯一個C++程序是總是會被定義

特別是開頭兩個在調試時真的非常有用。只要拿出它們倆,不用你自己編寫文件和行處理類,就能神奇的讓你獲得豐富的信息輸出.


你的編譯器可能還支持其它的宏,例如,你這從 這里 獲得(面向GCC)的整個宏清單.
那么當你運行預處理器時實際會發生什么呢?

    1. 替換所有的三字母組合,我會在將來的一篇文章中談論到他,因為盡管他只是一個歷史上的特性(而且你也要在GCC中對它進行切換),它仍讓是很有趣的.

    2. 將并列的源代碼分成多行.

    3. 移除所有的注釋并用一個空格替換.

    4. 處理(我們上面講到的)的預處理器指令。對于 #include, 他會在新文件上遞歸執行1 - 3步 :-)

    5. 處理轉義序列.

    6. 把文件發送給編譯器

如果你想看看預處理之后你的文件會是什么樣子 (誰不想呢?),你可以向 gcc 傳入 -E 選項. 這將會想stdout標準輸出發送預處理過的源代碼,并且沒有編譯和連接就直接終止gcc命令的執行。


例如
 

?
1
g++ -E myfile.cpp

你也可以使用這個參數:
 

?
1
-save-temps

編譯的后會有一份臨時文件。

拿下面這個簡單的程序說吧:
 

?
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
#define ONE 1
#define TWO 2
 
int main()
{
  printf("%d, %d\n", ONE, TWO);
  return 0;
}

用下面這行命令編譯
 

?
1
g++ hello.cpp -save-temps

編譯完后, 會在文件夾中生成兩個文件: hello.s 和 hello.ii

hello.s 里面是匯編代碼,  而 hello.ii 則是預處理過后的源代碼。

用文本編輯器打開 hello.ii , 你會發現多出許多代碼. 那是因為 #include 指令把 stdio 頭文件的代碼加進去了。

如果你把滾動條拉到最底下, 就會發現, printf  那一行的宏定義 ONE 和 TWO 已經被預處理器替換成 1 和 2 了 .

神奇吧!

其實它只是在編譯的時候, 把你的源代碼文件復制一份, 當作臨時文件, 然后把里面的預處理指令替換掉. 用完后就把這個臨時文件刪了. 所以一般情況下我們不知道這個文件的存在.

延伸 · 閱讀

精彩推薦
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
主站蜘蛛池模板: 免费一级毛片在级播放 | 午夜伦理:伦理片 | 91最新国产 | 91调教 | 欧美日韩高清观看一区二区 | 日韩免费在线视频 | 美女黄板视频 | a一级毛片录像带 录像片 | 国产专区日韩精品欧美色 | 亚洲国产欧美在线人成aaaa20 | 亚洲免费精品 | 91短视频社区在线观看 | 女主被当众调教虐np | 亚洲 欧美 国产 综合 播放 | 欧美人妖另类性hd | 草草草视频在线观看 | 男人的天堂久久 | 欧美一区二区三区综合色视频 | 人阁色第四影院在线观看 | 日韩亚洲人成在线 | 日本十大顶级绝伦推理片 | 98在线视频噜噜噜国产 | 情趣内衣在线观看 | waswaswas免费| 东北美女野外bbwbbw免费 | 四虎在线观看 | 国产精品www视频免费看 | 久久精品在现线观看免费15 | 蛮荒的童话未删减在线观看 | 天天做天天爱天天操 | 免费高清特黄a 大片 | 四虎影院观看 | 日韩a无吗一区二区三区 | 99久久综合 | 精品国产自在在线在线观看 | 久久久亚洲国产精品主播 | 男人插曲女人身体 | 好紧好爽范冰冰系列 | 亚洲精品无码不卡在线观看 | 欧美三级小说 | 久久青青草原精品国产软件 |