【问题标题】:include STL header file inside a function C++14在函数 C++14 中包含 STL 头文件
【发布时间】:2018-06-15 18:31:57
【问题描述】:

tl;dr:我可以让这段代码在 C++14 (GCC 6.3) 中运行吗?

int main(){
    #include<vector>
    std::vector<int> v{1,2,3};
    return 0;
}

但是下面的代码可以正常工作!

#include <iostream>
using namespace std;

int main() {
    #include<cstdio>
    using namespace __gnu_cxx;
    printf("Hello world\n.");
    return 0;
}

使用 C++14 (gcc-6.3) 代码无法编译,错误消息为

 error: 'namespace' definition is not allowed here
 namespace std
 ^~~~~~~~~

我为什么要这样做?

我无权访问允许我编写代码的函数之外的内容。我无法在全球范围内#include。

UPD:更改为 cstdlib 也有效问题不是标头保护排除(根据我),而是命名空间问题。因为 C++ 头文件有命名空间 std,而 c 头文件没有。我想问一下命名空间问题是否有一些调整?

【问题讨论】:

  • 你到底为什么要这样做?
  • "我在允许我编码的函数之外没有访问权限。"请求访问权限。
  • 如果是学校作业,不要那样做,反正会被拒
  • 所以你做在线评委是一种爱好或学习,但你想作弊。如果你只是在没有向量的情况下解决它,你就已经完成了。
  • @madhur4127 为什么不直接搜索该函数的实现并在代码中添加类似的内容?这些规则已明确设置,因此您不能仅通过使用库函数来解决任务。是的,我知道,有人要求你重新发明轮子很糟糕,但如果是这样,你必须这样做,你就必须这样做。

标签: c++ stl c++14


【解决方案1】:

我可以让这段代码工作吗

没有。标准头文件(以及一般的大多数库头文件)必须包含在全局命名空间范围内。

但是下面的代码可以正常工作!

但不保证能正常工作。它只是碰巧起作用了,可能是因为&lt;iostream&gt; 已经包含了&lt;cstdio&gt;,所以你自己的包含被标题保护删除了。

【讨论】:

  • 我认为标题保护排除它的情况并非如此。我使用 cstdlib 和 iosteam 运行代码并成功编译。我不相信像 malloc、rand 这样的函数包含在 iostream 中。
  • @madhur4127 为什么你不相信像 malloc 等函数可以包含在 iostream 中?那你怎么解释这个:coliru.stacked-crooked.com/a/f5eab48bd6077701
  • 我看到了this reference,它表明 malloc 是 cstdlib 的一部分,其中有 no function malloc。我仍然不明白为什么参考文献没有提到它或者它是 gcc 编译器的扩展?救命!
  • @madhur4127 参考文献没有提到它,因为 iostream 不需要包含 cstdlib。 stdlibc++(GNU 标准库实现)只是出于任何目的而选择包含它。标准库头文件允许包含其他头文件。
猜你喜欢
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多