c++ - C关键字/函数是否未包含在C++的std namespace 中?

标签 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;
}
Complie Error Description
显然,由于第3行int32_t time[int32_t(1e5)];而产生了错误
但是,我不明白为什么会发生编译错误。
我没有包含ctime或任何此类 header ,甚至还没有展开std命名空间。但是仍然发生编译失败。
我的系统上装有__cplusplus 201703的gcc 8.3.0。不知道在线平台上的版本是什么。

最佳答案

该标准说,当您包含任何标准包含文件时,可能会包含其他包含文件。取决于哪个和多少个实现。
这意味着您的代码根本不能定义任何也是标准的全局名称。
我可以理解,这似乎是一个困难的要求(实际上是这样),这也使我们感到奇怪,为什么根本没有标准的包含文件,而我们并没有简单地使用整个标准(这是一个好问题)。但是,情况仍然如此。
POSIX的情况甚至更糟,不仅保留了随机名称,而且还保留了很多前缀后缀;例如,使用任何名称(以开头,以LC_开头,以大写字母开头)的代码都可能与与语言环境支持相关的#define相冲突。任何以_t结尾的名称也将被保留,而不是在开玩笑。 The list is huge
通常,尝试定义尽可能少的全局名称,并避免使用标准库也使用的任何名称。即使在您的编译器上“有效”,您的程序在移植到另一个编译器(或同一编译器的下一版本)时也可能会发现问题。避免定义全局名称,还可以使您的代码更容易与其他人编写的代码集成到更大的程序中。理想情况下,您的代码应仅具有一个全局名称( namespace ,单个类或单个函数)...不幸的是,对于C++,您无法获得低于该名称的名称。
我记得在编写小型C++实验时碰到的东西通常不关心这些名称冲突问题,例如y0是标准的Bessel函数(这不是在开玩笑;有一个全局标准函数double y0(double)和任何程序在全局范围内将y0用于其他任何操作(不是有效的C++程序)。

关于c++ - C关键字/函数是否未包含在C++的std namespace 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62976831/

相关文章:

c++ - 如何定义模板类的 static const 变量

c++ - 在 C++ 中通过 int id 跟踪少量结构类型的有效方法是什么?

c++ - CMake:重建链接包时重新链接

Java 6 Source 向后兼容性和 SQL

c++ - AdjustTokenPrivileges 错误 ERROR_NOT_ALL_ASSIGNED

c++ - 为什么 std::generate 可以与 lambda 生成器一起使用而 std::fill 不能?

c++ - 测试 std::wstring 的长度时出现段错误

c++ - 如何将 std::generate/generate_n 与多态函数对象一起使用?

c++ - 用于维护 API 向后二进制兼容性的 GCC 与 MS C++ 编译器

c++ - gcc 和 libstdc++ 向前兼容