8

有代码(在 C++ 源文件的全局范围内编译为汇编指令)是否合法?以前,我的印象是除了Ch 编程语言(C/C++ 的解释器)之外,你不能有代码C++ 程序的全局范围。代码/指令只能在函数体内 [句号]!

但是,我发现您可以通过将函数分配给全局变量来调用 C++ 中的 main 函数之前的函数!这将涉及call汇编代码中的指令。您还可以将两个变量的总和分配给汇编代码之外的另一个全局变量。这几乎肯定会涉及到addmov指令。如果该代码在全局范围内,在任何函数之外,它什么时候执行?如果+是一个类类型的重载运算符,如果它里面有一个 print 语句,它什么时候执行?

您还可以在 C++ 程序的全局范围内拥有循环和控制结构,如果是,它们何时执行?对于其他程序构造,它们是否允许在全局范围内,在什么情况下以及何时执行?

这个问题是对我之前发布的问题的回应: 为什么我不能在 C 中的函数之外为全局变量赋值?

原始问题的回答者断言您不能拥有超出函数范围的代码。我认为我不完全理解这方面的规则,以及究竟什么被认为是“代码”。

int foo() {
    cout << "Inside foo()" << endl;
    return 5;
}

// is this not code?
int global_variable = foo();

// How does this statement work without generating code?
int a = 4;
int b = 5;
int c = a + b;

int main() {
    // The program behaves as if the statements above were executed from
    // top to bottom before entering the main() function.
    cout << "Inside main()" << endl;
    cout << "int c = " << c << endl;
    return 0;
}
4

1 回答 1

25

您链接到的问题的答案是以一种简单的方式说话,而不是对构造使用严格的 C++ 命名。

由于更加迂腐,C++ 没有“代码”。C++ 有声明、定义和语句。语句是您可能认为的“代码”:if、、、for表达式等。

只有声明和定义可以出现在全局范围内。当然,定义可以包括表达式。int a = 5;定义一个由表达式初始化的全局变量。

但是您不能只在全局范围内使用随机语句/表达式,例如a = 5;. 也就是说,表达式可以是定义的一部分,但表达式不是定义。

您当然可以在之前调用函数main。过于复杂而无法在编译时执行的全局变量构造函数和初始化程序必须在main. 例如:

int b = []()
{
    std::cout << "Enter a number.\n";
    int temp;
    std::cin >> temp;
    return temp;
}();

编译器不能在编译时这样做;它是交互式的。而 C++ 要求所有全局变量在main开始之前都被初始化。因此编译器将不得不调用代码 pre- main。这是完全合法的。

每个 C++ 编译和执行系统都有一些机制来调用之前之后的代码main。必须初始化全局变量,并且可能需要调用对象构造函数来进行初始化。完成后main,必须销毁全局变量,这意味着需要调用析构函数。

于 2018-08-16T22:56:57.403 回答