C 关键字/函数是否未包含在 C++ 的 std 命名空间中?

dea*_*ock 8 c++ std backwards-compatibility

以下代码在我的本地系统上运行良好,但在在线平台上引发了编译错误。

#include <iostream>

int32_t time[int32_t(1e5)];

int main()
{
    int32_t n;
    std::cin>>n;
    for(int32_t i=0;i<n;++i)
    {
        int32_t temp;
        std::cin>>temp;
        --temp;
        ++time[temp];
    }
    
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译错误描述

显然,错误是由于第 3 行int32_t time[int32_t(1e5)]; 而产生的但是,我无法理解为什么会发生编译错误。

我没有包含ctime或任何这样的标题,甚至没有解开std命名空间。但是仍然发生了编译失败。

我的系统上有带有 __cplusplus 201703 的 gcc 8.3.0。不确定在线平台上的版本是什么。

650*_*502 10

该标准说,当您包含任何标准包含文件时,这可能会包含其他包含文件。实现依赖于哪些以及它们中有多少。

这意味着您的代码不能定义任何也是标准的全局名称。

我可以理解这似乎是一个困难的要求(确实如此),而且这也让人想知道为什么有标准的包含文件,而我们没有简单的可用的整个标准(这是一个很好的问题)。但情况仍然如此。

POSIX 的情况更糟,不仅保留了随机名称,还保留了很多前缀后缀;对于使用任何名称的示例代码开始LC_随后以任何方式大写字母可能与冲突#define有关的本地支持秒。任何以 结尾的名字_t也是保留的,不是开玩笑的。名单很大

作为一般规则,尝试定义尽可能少的全局名称并避免标准库也使用的任何内容。即使在您的编译器上“它有效”,您的程序在移植到另一个编译器(或同一编译器的下一个版本)时也可能会发现问题。避免定义全局名称也使您的代码更容易集成到包含其他人编写的代码的大型程序中。理想情况下,您的代码应该只有一个全局名称(命名空间、单个类或单个函数)……不幸的是,使用 C++,您无法低于该名称。

我记得在编写小型 C++ 实验时遇到的一些事情,当我通常不关心这些名称冲突问题时,例如y0这是一个标准的 Bessel 函数(这不是开玩笑;有一个全局标准函数double y0(double)和任何y0用于全局级别的任何其他内容都不是有效的 C++ 程序)。


Far*_*ari 6

time.h间接包含头文件。在这个头文件中有一个time与您的声明冲突的函数声明。

只需将变量更改time为另一个名称 ( time_1)。

  • `&lt;time.h&gt;` 中的 `time` 实际上是一个声明的函数,而不是一个变量。 (2认同)