我想知道我是否可以依靠標準報頭中包含守衛的特定定義。如果我用Visual Studio查看我的系統,例如,我可以看到stdint.h定義了_STDINT
。我的問題是,如果我也可以依靠#define
來編譯其他編譯器。基本上,我這樣做是安全的這樣做:我可以依靠標準報頭中的包含守衛
#ifndef _STDINT
typedef char int8_t;
#endif
我知道這可能看起來很愚蠢。爲什麼不只是包含stdint.h你說?那麼我正在編寫可能部署嵌入式目標的代碼,這可能並不滿足於包含某些標準c頭文件。但是,我希望能夠在可用時使用它們。因此,我希望能夠在具有int main()
的文件中選擇是否要包含stdint.h。
簡短的答案是否定的,長的答覆是親愛的神 - 不要 - 做這個。下劃線#define僅爲文件範圍保留,因此在該文件之外使用它們是充滿風險的。 處理這個(imho)的正確方法是提供你自己的「stdint.h」,如果它在目標機器上找不到的話。我會做一個可選的包含目錄,如果編譯器不兼容c99/posix,則包含該目錄。然後用'#include「stdint.h」'包含stdint。 – IdeaHat 2014-10-27 14:29:24
「一個可選的包含目錄,如果編譯器不兼容c99/posix,則包含該目錄」。原諒我的無知。我怎麼做?通過編譯器標誌?或者根據c99配置我的系統的另一個頭文件定義了什麼? – xaviersjs 2014-10-27 14:32:55
@xaviersjs它依賴於編譯器,但是,它通常歸結爲給編譯器一條額外的路徑。 – user694733 2014-10-27 14:36:14