回答
對於像項目中所有文件包含的前綴頭文件這樣的東西很有用 - 有點像Windows中可怕的StdAfx.h或Mac OS上的.prefix.h文件。
-include
選項的一個實際應用是在Linux內核構建系統中。
在構建Linux內核時,可以運行大量配置選項菜單來定製構建的內核。舉例來說,這裏是你是否要支持多個CPU內核的x86架構,爲Linux 3.0內核配置選項:
config SMP
bool "Symmetric multi-processing support"
---help---
This enables support for systems with more than one CPU. If you have
a system with only one CPU, like most personal computers, say N. If
you have a system with more than one CPU, say Y.
[...]
中的源代碼,這個選項會顯示爲一個預處理符號, CONFIG_SMP
。當多個處理器需要不同的代碼時,內核和驅動程序中的源代碼可以執行#ifdef CONFIG_SMP
。 (它也可以在Makefile
內使用,使用不同的語法來選擇是否編譯.c
文件或子目錄。)
這些預處理符號是如何定義的?它們沒有在編譯器命令行上定義,因爲它會非常漫長(典型的分發內核中有幾千個這樣的符號;我在這臺機器上運行的內核數量超過了4000個)。相反,所有這些選項都會自動生成一個神奇的頭文件。這個頭文件然後通過-include include/generated/autoconf.h
選項自動包含在所有編譯的文件中。
由於CONFIG_
預處理器符號應該在所有內核源代碼文件的所有位置都可用,因此使用-include
(在文件的第一行之前隱式包含它)是一件好事。沒有它,你會做下列之一:
- 明確包括它作爲第一個包含上千種內核源代碼文件的每一個文件,希望大家都不忘記把它列入或增加了一些之前包括。
- 明確包括它在一個常用的標題(如
kernel.h
),並希望沒有這取決於CONFIG_
符號的第一直接或間接包含該頭的前面。
這些選項中的任何一個明顯都不如-include
。
在Linux內核上有另一種使用-include
,但它更深奧。內核部分(尤其是啓動代碼的早期部分)必須以實模式運行。與過去一樣,彙編程序不是像彙編程序那樣完全編寫代碼,而是指示彙編程序發出32位實模式代碼(.code16gcc
)。這是一定要做的源代碼的第一件事,先天下之憂,這使它成爲一個偉大的比賽,以-include
(頭包括這一次只有一個asm(".code16gcc");
語句)。
它可以在編譯時以類似於庫在運行時預加載的方式使用:臨時覆蓋源文件中的某些內容。例如,如果您希望支持比系統上的glibc版本舊的glibc,那麼可以使用它來包含覆蓋默認glibc符號版本的頭文件。
我的這兩個仙: 我碰巧使用-include指令和「編譯時」自動生成的頭文件。 這樣,您的代碼就可以在默認情況下工作,並且不會污染可能存在或不存在的文件(例如依賴性計算會抱怨),但您可以根據外部配置修改代碼行爲。
- 1. gcc中的-o選項是什麼?
- 2. 那些gcc選項在做什麼?
- 3. #include「MyClass.h」和#include「。\ myclass.h」有什麼區別?
- 4. 爲什麼HTML中沒有'include'指令?
- 5. System.Collections - 爲什麼有這麼多選項?
- 6. 爲什麼fabs()在編譯GCC時不需要-lm選項
- 7. 模擬Microsoft C編譯器行爲的GCC選項是什麼?
- 8. -m32,-m64和gcc的選項中沒有什麼區別?
- 9. 爲什麼bootstrap選項沒有設置?
- 10. 爲什麼忽略一些setxkbmap選項?
- 11. gcc和gcC++有什麼不同?
- 12. 'gcc -g'和'gcc -g3'有什麼區別?
- 13. 爲什麼不能用GCC
- 14. gcc 4.9.1有什麼問題?
- 15. 爲什麼這個選擇框不顯示「選擇一個」選項?
- 16. 爲什麼在同一個SMT求解器中有多個選項
- 17. AIX的XL編譯器的-qfuncsect選項的gcc等效選項是什麼?
- 18. 使用grep --include選項?
- 19. 爲什麼-O3 GCC Optimization沒有內聯這個功能?
- 20. gcc -finline-functions選項
- 21. GCC鏈接選項
- 22. 爲什麼這個按鈕出現在所有UITextField選項中?
- 23. 爲什麼我們使用`#include「stdafx.h」`而不是`#include <stdafx.h>`?
- 24. 爲什麼checkboxpreference是一個空對象首選項
- 25. 爲什麼ng-include不工作?
- 26. 爲什麼不#include <Python.h>工作?
- 27. 爲什麼#需要#include <stdio.h>?
- 28. 對於Windows中的cl,gcc的-mwindows選項等效於什麼?
- 29. 什麼做在gcc /鐺編譯器選項-f和-m代表
- 30. 這是什麼gcc編譯器選項? (-lGL -lGLU -llglut)
海灣合作委員會有一堆奇怪的選擇。這就是開源軟件的奇蹟。 – 2011-05-22 16:49:51
我繼續前進,重新提出了這個問題。希望它不會再將人們視爲「主觀的和議論性的」。那不是我的意圖。 – andrewdski 2011-05-22 17:29:55
我認爲這是一個合理的問題。但即使在這裏使用「好」這個詞也會讓你陷入困境。 – 2011-05-22 17:33:03