是否可以知道是否包含标头
Is it possible to know if a header is included
在源代码中是否可以知道是否包含标头?
这是我需要的一个例子:
#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;
};
但是,出于以下几个原因,这可能是一个坏主意:
- 用户需要在包含iostream之后包含上述标头,否则编译器将删除该函数。
- 如果在任何时候,iostream 库的创建者决定更改 #define 名称,则该函数将被删除。同样,如果有人使用具有不同 #define 标签的不同版本的iostream,则该函数将被删除。
- 在上面的示例中,仅包含库本身并没有太大区别。如果某个随机用户不使用库,则其程序的最终大小不会有太大差异,功能也不会发生任何变化。
所以基本上,是的,这是可能的,但不实用。特别是对于长期维护。好处不会超过危险。只需自己包括有问题的库即可。
正如其他人在这里所说,如果我们知道您的最终结果是什么,那将很有帮助。您计划使用它的地方很可能有更好的解决方案。
是的,这样做的一个快速技巧是:
您需要做的就是转到源代码头文件。并通过以下方式访问任何成员(在头文件源代码中任何位置定义的任何常量) -
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$
- 在CMake中使用find_package时,是否会显式包含标头
- C++-字符串是否包含一个带有简单循环的单词
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 检查一个数组是否包含在另一个数组中,以相反的顺序,至少两次
- 检查路径是否包含C++中的另一个路径
- GCC 包含标头(使用"-include")CMake 未检测到的更改
- C++17:使用 std::optional 来评估枚举是否包含值
- 如何检查 int 变量是否包含合法(非陷阱表示)值?
- 如何确定integer_sequence在编译时是否包含给定的数字?
- 使用预处理指令检查是否包含标头?
- c++ 是否保证标头初始化的静态 const 成员跨编译单元和库共享单个实例?
- 更智能地在C++中包含保护,以便在不同的命名空间中多次包含标头
- 有没有办法搜索向量的元素,<String>然后检查它是否包含特定的字符,如果它确实打印了它
- 尝试使用 indexOf 创建一个 if 语句来检查字符串是否包含字符.有一点麻烦
- 如何在 c++ 中有条件地包含标头?
- 如何检查字符串是否包含所有这些:数字、字母和特殊字符
- 是否可以链接到,包括和使用静态库,而无需额外包含标头/文件
- 有没有一种方法可以通过宏来检测标准标头是否包含在其中
- 是否未指定标准库标头是否包含任意标头
- 是否可以知道是否包含标头