是否可以知道是否包含标头

Is it possible to know if a header is included

本文关键字:是否 包含标      更新时间:2023-10-16

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

这是我需要的一个例子:

#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"。

是的。标头通常使用包括保护,例如:

#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()进行测试。

首先,检查标头,"在运行时"和"在编译时"没有什么不同,因为#include与任何#ifdef一起在编译时执行。#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. 在上面的示例中,仅包含库本身并没有太大区别。如果某个随机用户不使用库,则其程序的最终大小不会有太大差异,功能也不会发生任何变化。

所以基本上,是的,这是可能的但不实用。特别是对于长期维护。好处不会超过危险。只需自己包括有问题的库即可。

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

是的,这样做的一个快速技巧是:

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

cout<<ACCESSED_MEMBER

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

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

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

注意: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;
}

输出:

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$