回答
#include <cmath>
與任何庫都沒有關係,並且一切都與頭文件有關。假設你確實意味着如果你包含一個特定的頭文件,你想編譯失敗,你應該能夠利用GCC's support for specifying include directories through environment variables。
爲此,請創建或編輯適當的環境文件。例如,如果您在Debian上使用GNU bash,則可以創建一個文件/etc/profile.d/gcc-include-dirs
。在啓動shell時,/etc/profile.d中的所有內容都是可讀的,因此它將應用於在該點之後啓動的所有shell。 (絕對肯定,你可能需要註銷並重新登錄在一次,然後發出env | grep INCLUDE
確認。)用你喜歡的編輯器創建一個這樣的文件,並添加以下代碼行:
export C_INCLUDE_PATH=/usr/local/include/fail:${C_INCLUDE_PATH}
export CPLUS_INCLUDE_PATH=/usr/local/include/fail:${CPLUS_INCLUDE_PATH}
確保文件每個人都可讀(chmod 644 /etc/profile/gcc-include-dirs
),並且它由根(chown root:root /etc/profile/gcc-include-dirs
)擁有。
如果您在特定時間只需要這種行爲,您還可以將該文件放在其他地方並簡單地source
。在這種情況下,從有問題的shell註銷並重新登錄將會恢復GCC的正常行爲(您不需要從整個會話中註銷,只需要那個特定的shell實例)。在這種情況下啓動一個子shell並從該子shell中獲取文件也將很好地工作;完成後只需exit
。
然後創建一個文件/usr/local/include/fail/cmath
,內容如下:
#error "Failing because you included 'cmath'"
確保文件也就是任何人讀取,並通過超級用戶擁有。 #error及其邪惡的雙胞胎#warning分別發出致命錯誤和編譯警告,因此無論何時包含此文件,GCC都將遇到#error預處理程序指令,從而導致致命錯誤的發生,從而導致編譯失敗。
如果您想要爲單個編譯覆蓋此行爲,只需使用gcc的-I
參數指定真實math.h所在目錄的路徑。由於-I
優先於$C_INCLUDE_PATH
和$CPLUS_INCLUDE_PATH
這意味着您隨後包含C庫的版本。例如,cc -o mathprogram -I/usr/include mathprogram.c
將在中使用/ usr/include中的math.h,而不管/ usr/local/include/fail中的內容可能是什麼,因爲它首先在/ usr/include中顯示。因爲這隻影響編譯(並且只通過shell開始編譯),所以系統中已有的所有內容都將完全不受影響(除非它們對這兩個環境變量有一些奇怪的依賴關係)。
對於c*
標頭,您可能還需要創建相應的*.h
標頭,其內容與c*
標頭的內容相同。這是因爲例如cmath
可能簡單地映射到math.h
(C中相同標題的名稱)。簡單地製作另一個文件,就像上面的文件一樣,但是反過來抱怨math.h
。 (GCC並不在意,但它使診斷更容易)。您可能還需要將文件放在其他位置(我不確定包含CCC頭文件所需的目錄結構)。在這種情況下,find/-name cmath
(或類似的東西)可以讓你瞭解在/ usr/local/include/fail下需要複製的結構。
請注意這不會阻止人們簡單地將頭文件的相關部分複製到他們自己的源代碼中;從編譯器的角度來看,沒有什麼不可思議的頭文件。取決於你想要保護什麼,這可能是一個問題。
簡單地使用預處理器符號來省略庫頭文件怎麼樣? 使用gcc選項-DDONT_WANT_LIBS
進行編譯將失敗,因爲庫頭文件中缺少庫聲明。
#ifndef DONT_WANT_LIBS
#include<specific_library_header.h>
#endif
...
...
這不會是最佳的,因爲我正在編譯從我的參賽者進來的噸文件。 –
這對我來說聽起來像學生(或參賽者或誰)應該(重新)實施某些事情而不是包括標準標題。然後這是一個快速檢查,以解決那些仍然包括它的問題。這不是從你自己的代碼中排除你自己的頭文件。 – Mario
@Mario是的,我用cms來舉辦比賽。 –
- 1. g ++編譯器中包含的g ++功能函數
- 2. 非特定`包含文件名 - 系統Verilog編譯器指令
- 3. 如何「觸摸」包含特定頭文件的所有文件?
- 4. 編譯致命錯誤頭文件G ++
- 5. Cygwin編譯器頭包含錯誤(OpenSSL)
- 6. 從C++頭文件奇怪的g ++編譯器錯誤
- 7. 不能編譯MOC文件:頭文件不包含<QObject>
- 8. 包含子目錄中的g ++頭文件
- 9. OpenGLES頭文件包括Availability.h防止CPP文件編譯
- 10. Raspbain G ++編譯器停在--m命令
- 11. 包含Linux頭文件
- 12. 包含頭文件
- 13. 的Eclipse停止編譯的renderScript文件
- 14. 如何找出g ++包含哪個頭文件?
- 15. 已編譯的庫vs僅包含頭文件的庫
- 16. g ++編譯多個文件
- 17. xcode包含的頭文件
- 18. Visual Studio的預編譯頭文件包含什麼?
- 19. 編譯包含OpenCV頭文件的JNI庫
- 20. 如何修正包含emscripten頭文件時的編譯錯誤?
- 21. 在不包含頭文件的情況下編譯
- 22. 如何編譯包含LLVM API頭文件的C++程序?
- 23. Qt包含和預編譯頭文件的最佳實踐?
- 24. 使用包含的頭文件編譯表單
- 25. 包括包含.jar文件編譯
- 26. 包含在頭文件中
- 27. 包含自定義頭文件(ANSI C)
- 28. 在附加頭文件中包含頭文件包括路徑
- 29. 編譯器編譯外部包含
- 30. 編譯器編譯也包含了嗎?
感謝您的回答。正在進行比賽,不能嘗試。但是,謝謝! –