首先,檢查報頭「在運行時」和「在編譯時」並沒有什麼不同,因爲#include
在執行編譯時間以及任何#ifdef
。 A #include
實質上是在.cpp文件頂部的標題的複製粘貼。 Razvan Cojocaru指出,你可以使用#ifdef
來檢查天氣_GLIBCXX_IOSTREAM
的定義。這裏是哪裏這可以用於一個小例子:
class Flagger
{
typedef unsigned long ulong;
public:
Flagger (ulong flags = 0) : f(flags) { ; }
Flagger (const Flagger& cpy) : f(cpy.f) { ; }
void clear (ulong flags) { f &= ~flags; }
void set (ulong flags) { f |= flags; }
void toggle (ulong flags) { f ^= flags; }
bool get (ulong flags) { return f & flags; }
#ifdef _GLIBCXX_OSTREAM
friend std::ostream& operator << (std::ostream &out, const Flagger& f)
{ /* print it how you want it*/ }
#endif
private:
ulong f;
};
然而,這可能是由於以下幾個原因壞主意:
- 用戶將需要包括包括後上述頭iostream或編譯器會刪除該函數。
- 如果iostream庫的製作者在任何時候決定更改#define名稱,該函數將被刪除。同樣,如果有人使用具有不同#define標籤的不同版本的iostream,該功能將被刪除。
- 在上面的例子中,僅僅包含庫就沒有太大差別。如果一些隨機用戶不使用該庫,那麼他們的程序的最終大小將不會有太大的差別,功能也不會有任何改變。
因此,基本上,是的,它是可能,但不實用。尤其對於長期維護。好處不會超過危險。只需要自己包括圖書館。
正如他人在這裏所說,如果我們知道你的最終結果是什麼,這將是有幫助的。你打算使用這個地方最有可能有一個更好的解決方案。
'#ifdef'在編譯之前運行,絕對不在運行時運行。 – chris
任何問題的解決方案!是我想要的可能! – BBeta
是的,可以知道是否包含標題。只要看看你的源文件的頂部。 –