gpt4 book ai didi

c++ - 具有称为 main 的全局变量而不是 main 函数的程序如何工作?

转载 作者:IT老高 更新时间:2023-10-28 11:56:09 26 4
gpt4 key购买 nike

考虑以下程序:

#include <iostream>
int main = ( std::cout << "C++ is excellent!\n", 195 );

在Windows 7 OS上使用g++ 4.8.1 (mingw64),程序编译运行良好,打印:

C++ is excellent!

到控制台。 main 似乎是一个全局变量而不是一个函数;如果没有 main() 函数,这个程序如何执行?此代码是否符合 C++ 标准?程序的行为是否定义明确?我也使用了 -pedantic-errors 选项,但程序仍然可以编译和运行。

最佳答案

在深入探讨到底发生了什么之前,重要的是要指出根据 defect report 1886: Language linkage for main() 的程序格式错误。 :

[...] A program that declares a variable main at global scope or that declares the name main with C language linkage (in any namespace) is ill-formed. [...]

clang 和 gcc 的最新版本会导致此错误,程序将无法编译( see gcc live example ):

error: cannot declare '::main' to be a global variable
int main = ( std::cout << "C++ is excellent!\n", 195 );
^

那么为什么在旧版本的 gcc 和 clang 中没有诊断?直到 2014 年底,该缺陷报告甚至都没有提出解决方案,因此这个案例只是在最近才出现明显的错误,需要进行诊断。

在此之前,这似乎是未定义的行为,因为我们违反了第 3.6.1 节中的 C++ 标准草案 shall 要求 [ basic.start.main]:

A program shall contain a global function called main, which is the designated start of the program. [...]

未定义的行为是不可预测的,不需要诊断。我们在重现行为时看到的不一致是典型的未定义行为。

那么代码实际上在做什么,为什么在某些情况下它会产生结果?让我们看看我们有什么:

declarator  
| initializer----------------------------------
| | |
v v v
int main = ( std::cout << "C++ is excellent!\n", 195 );
^ ^ ^
| | |
| | comma operator
| primary expression
global variable of type int

我们有 main,它是一个在全局命名空间中声明并正在初始化的 int,该变量具有静态存储持续时间。在尝试调用 main 之前是否会进行初始化是由实现定义的,但似乎 gcc 在调用 main 之前会执行此操作。

代码使用 comma operator ,左操作数是一个丢弃的值表达式,在这里仅用于调用 std::cout 的副作用。逗号运算符的结果是右操作数,在这种情况下是纯右值 195,它被分配给变量 main

我们可以看到sergej points out生成的程序集显示在静态初始化期间调用了 cout。虽然更有趣的讨论点see live godbolt session会是这样的:

main:
.zero 4

及后续:

movl    $195, main(%rip)

可能的情况是程序跳转到符号 main 并期望有效代码存在于 some cases will seg-fault 中。 .因此,如果是这种情况,我们希望在变量 main 中存储有效的机器代码可能会导致 workable program,假设我们位于允许代码执行的段中。我们可以看到this 1984 IOCCC entry just that .

看来我们可以使用 ( see it live ) 让 gcc 在 C 中执行此操作:

const int main = 195 ;

如果变量 main 不是 const 可能会出现段错误,可能是因为它不在可执行位置中,提示此 comment here这给了我这个想法。

另见 FUZxxl answer here到这个问题的 C 特定版本。

关于c++ - 具有称为 main 的全局变量而不是 main 函数的程序如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32851184/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com