【发布时间】:2021-11-24 04:37:39
【问题描述】:
考虑以下 C++17 代码:
#include <iostream>
int read;
int main(){
std::ios_base::sync_with_stdio(false);
std::cin >> read;
}
它使用 GCC 11.2 和 Clang 12.0.1 在 Godbolt 上编译和运行良好,但如果使用 -static 键编译会导致运行时错误。
据我了解,有一个名为 read 的 POSIX(?) 函数(请参阅 man read(2)),因此上面的示例实际上调用了 ODR 违规,即使在没有 @987654327 的情况下编译该程序也基本上是格式错误的@。如果我尝试命名变量malloc:built-in function 'malloc' declared as non-function
上面的程序是有效的 C++17 吗?如果不是,为什么?如果是,是否是编译器错误导致其无法运行?
【问题讨论】:
-
@Someprogrammerdude 实际上,这是原始问题的来源。随机 C++ 谜语的重要来源。
-
@Someprogrammerdude 同样,是否需要
sync_with_stdio(0)很大程度上取决于比赛。例如,很多俄罗斯当地的 ICPC 比赛的时间限制非常严格,您最好不要使用<iostream>,因为它很慢。显然,它是大型 I/O 和此类比赛中使用的特定编译器/默认编译标志的组合。 -
不幸的是,这也是误解和完全糟糕的代码示例的重要来源。这些网站对 C++ 初学者造成的伤害是巨大的。这与专业编程无关。
-
@Evg 是的,有点。但是,在这种情况下,此行是 必需 才能发生问题。这本身并不违法,因此是个问题。
-
全局命名空间是狂野的西部。上面的程序是有效的 C++17 if 它没有 ODR 违规。 ODR 是由于您提供的代码还是由于平台提供的代码无关紧要。
标签: c++ gcc language-lawyer posix clang++