[英]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.