簡體   English   中英

預處理程序如何處理宏?

[英]How are macros handled by preprocessor?

我正在閱讀Efficient c ++(舊版本),並且有一些疑問。 例如,在這里說:

當你做這樣的事情

 #define ASPECT_RATIO 1.653 

編譯器可能永遠不會看到符號名ASPECT_RATIO; 在編譯源代碼之前,預處理器可能會刪除它。 結果,ASPECT_RATIO可能永遠不會輸入到SYMBOLIC_TABLE。 如果您在編譯過程中遇到涉及常量的錯誤,這將令人困惑,因為錯誤消息可能引用的是1.653,而不是ASPECT_RATIO

我不明白這一段,怎么能去除預處理器呢? 在現實世界中可能是什么原因以及可行性如何?

謝謝

這只是全局搜索,然后在將文件傳遞給編譯器之前將“ ASPECT_RATIO”替換為文件中的“ 1.653”

這就是宏如此危險的原因。 如果您具有#define max 123和一個變量int max = 100則編譯器將獲得int 123 = 100並且您將收到一個令人困惑的錯誤消息

我不理解該段落在反引號下的樣子,如何才能刪除預處理器? 在現實世界中可能是什么原因以及可行性如何?

基本上,它所描述的正是C和C ++預處理器的工作方式。 原因是將宏/常量(使用#define指令創建)替換為其實際值,而不是一遍又一遍地重復相同的值。 在C ++中,使用C樣式宏被認為是不好的樣式,但是C兼容性支持它們。

顧名思義,預處理器在實際編譯之前運行,並且基本上是按照預處理器指令(以#開頭的指令)的指示更改源代碼。 這還包括用其值替換宏,按照#include指令的指示包含頭文件等。

這是為了避免代碼重復,幻數,共享接口(頭文件)和許多其他有用的東西。

預處理器將用實際的令牌1.653替換代碼中出現的令牌ASPECT_RATIO所有實例...因此編譯器將永遠不會看到令牌ASPECT_RATIO 到編譯代碼時,它只能看到由預處理器替換的文字標記1.653

基本上,使用這種方法會遇到的“問題”是編譯器不會將ASPECT_RATIO視為符號,因此在調試器等中,您無法查詢值ASPECT_RATIO,因為它是變量。 它不是一個具有像static const int可能具有的內存地址的值(我說“可能”,因為優化的編譯器可能會決定像預處理程序一樣工作,並優化對顯式內存地址的需求以達到存儲常量值,而不是簡單地用文字值替換代碼中出現的任何值)。 在更大的函數宏中,它也不會像實際的C / C ++函數那樣具有指令地址,因此您不能在函數宏中設置斷點。 但是從更一般的意義上講,除非您打算將宏用作調試符號和/或在宏中設置調試斷點,否則我不確定是否將其稱為“問題”。 否則,宏將執行其工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM