6

在源代码中是否可以知道是否包含标头?

这是我需要的一个例子:

#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 Defined”。

4

4 回答 4

5

是的。标头通常使用包括警卫,例如:

#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()用于测试。

于 2013-10-20T18:13:40.887 回答
0

首先,检查头文件,“在运行时”和“在编译时”没有什么不同,因为#include在编译时与 any 一起执行#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. 在上面的示例中,仅包含自己的库并没有太大的不同。如果某个随机用户不使用该库,他们的程序的最终大小不会有太大的不同,并且功能根本不会改变。

所以基本上,是的,这是可能的,但不实用。尤其适合长期维护。好处不超过危险。只需自己包含有问题的库。

正如其他人在这里所说,如果我们知道您的最终结果是什么,那将会很有帮助。您计划使用它的地方很可能有更好的解决方案。

于 2014-05-10T19:26:47.857 回答
0

是的,一个快速的方法是:

您需要做的就是转到源代码头文件。并通过 - 访问任何成员(在头文件的源代码中的任何位置定义的任何常量)

cout<<ACCESSED_MEMBER

现在编译并运行程序,如果您在控制台上打印了它,那么恭喜,该文件已成功包含在您的代码中。

注意:1为头文件查找特定的源文件。您可以在终端上键入

locate <header_file_name> 您将获得文件的位置。现在通过在 vi 或 nano 或 gedit 或您选择的任何编辑器中打开它来检查任何成员。

注意:2如果此头文件不归您所有,请勿对其进行任何更改。

于 2017-06-26T12:46:28.210 回答
-3

当然有可能:

#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;
}

输出:

paul@local:~/src/cpp/scratch$ ./incl
Enter a header name: iostream
iostream is included.
paul@local:~/src/cpp/scratch$ ./incl
Enter a header name: map
map is not included.
paul@local:~/src/cpp/scratch$
于 2013-10-20T18:29:58.040 回答