2013-10-20 70 views
3

在源代碼中是否可以知道是否包含標題?是否可以知道是否包含標題

這什麼,我需要一個例子:

#include<iostream> 
using namespace std; 

int main() 
{ 
    char headname[4]; 
    cout<<"Enter a header name : "; 
    cin>>headname; 

    #ifdef headname 
     cout<<headname<<" Defined"<<endl; 
    #else 
     cout<<headname<<" Not defined"<<endl; 
    #endif 

    return 0; 
} 

例如,如果我輸入「的iostream」,輸出應該是「iostream的定義」。

+4

'#ifdef'在編譯之前運行,絕對不在運行時運行。 – chris

+0

任何問題的解決方案!是我想要的可能! – BBeta

+4

是的,可以知道是否包含標題。只要看看你的源文件的頂部。 –

回答

3

是的。標題通常使用包括警衛,例如:

#ifndef MY_HEADER_INCLUDED 
#define MY_HEADER_INCLUDED 

// [...] 

#endif 

在我的Gentoo Linux/GCC系統,看iostream頭我看到:

#ifndef _GLIBCXX_IOSTREAM 
#define _GLIBCXX_IOSTREAM 1 

,所以你可以檢查_GLIBCXX_IOSTREAM。如果您沒有使用GCC,請打開您的iostream頭文件並查看它們可能定義的宏。

還應該指出,cout屬於iostream頭,所以當_GLIBCXX_IOSTREAM(在我的情況下)沒有定義,代碼也將無法編譯。但是您可以使用printf()進行測試。

+3

但是這會導致編譯時檢查(#ifdef)而不是運行時。 –

+0

'#ifdef'是一個預處理指令。運行期間不使用。 – Kunal

+1

是的,運氣好的話,在運行時檢查一個'char []'... –

2

當然這是可能的:

#include <iostream> 
#include <vector> 
#include <string> 
#include <algorithm> 

int main(void) { 
    std::vector<std::string> includes; 
    includes.push_back("iostream"); 
    includes.push_back("vector"); 
    includes.push_back("string"); 
    includes.push_back("algorithm"); 

    std::string user_input; 
    std::cout << "Enter a header name: "; 
    std::cin >> user_input; 

    if (std::find(includes.begin(), includes.end(), user_input) != 
      includes.end()) { 
     std::cout << user_input << " is included." << std::endl; 
    } else { 
     std::cout << user_input << " is not included." << std::endl; 
    } 

    return 0; 
} 

輸出:

[email protected]:~/src/cpp/scratch$ ./incl 
Enter a header name: iostream 
iostream is included. 
[email protected]:~/src/cpp/scratch$ ./incl 
Enter a header name: map 
map is not included. 
[email protected]:~/src/cpp/scratch$ 
+0

嗯......這是關於什麼的?不是OP詢問的問題 – P0W

+1

它正是OP所要求的,它使得他的程序的用戶能夠在運行時檢查源代碼中包含的頭文件。 –

+2

OP是在幻想中可以以某種方式自動執行此過程。它不是。 – EboMike

0

首先,檢查報頭「在運行時」和「在編譯時」並沒有什麼不同,因爲#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; 
}; 

然而,這可能是由於以下幾個原因壞主意

  1. 用戶將需要包括包括後上述頭iostream或編譯器會刪除該函數。
  2. 如果iostream庫的製作者在任何時候決定更改#define名稱,該函數將被刪除。同樣,如果有人使用具有不同#define標籤的不同版本的iostream,該功能將被刪除。
  3. 在上面的例子中,僅僅包含庫就沒有太大差別。如果一些隨機用戶不使用該庫,那麼他們的程序的最終大小將不會有太大的差別,功能也不會有任何改變。

因此,基本上,是的,它是可能,但不實用。尤其對於長期維護。好處不會超過危險。只需要自己包括圖書館。

正如他人在這裏所說,如果我們知道你的最終結果是什麼,這將是有幫助的。你打算使用這個地方最有可能有一個更好的解決方案。

-1

是的,一個快速的黑客要做到這一點:

所有你需要做的就是去到源代碼的頭文件。並訪問任何成員通過(在頭文件的源代碼的任何定義的常量) -

cout<<ACCESSED_MEMBER

現在編譯並運行程序,如果你得到它印在控制檯那麼恭喜,該文件被成功列入你的代碼。

注意:1查找特定的標頭源文件。您可以在終端上鍵入

locate <header_file_name> 您將獲得文件的位置。現在通過vi或nano或gedit或您選擇的任何編輯器打開它來檢查任何成員。

注意:2如果不屬於您,則不要對此頭文件進行任何更改。

相關問題