【问题标题】:Can C++ have code in the global scope?C++ 可以在全局范围内有代码吗?
【发布时间】:2019-01-23 22:52:52
【问题描述】:

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

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

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

这个问题是对我之前发布的问题的回应: Why can't I assign values to global variables outside a function in 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;
}

【问题讨论】:

  • 在伪汇编代码中:mov 4, a 将值 4 移动到恰好存储在内存中的任何位置。
  • 您不能在函数之外拥有诸如赋值、循环、if/else 之类的 C++ 代码。正如您的评论所证明的那样,这并不意味着编译器无法在函数之外生成机器代码。
  • 所有看似在函数之外运行的代码都会被编译器放置在一个特殊的不可见启动函数中。
  • Scope 是 C++ 的东西,汇编不是。我认为你对它们的卷积感到困惑。

标签: c++ startup machine-instruction


【解决方案1】:

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

更迂腐,C++ 没有“代码”。 C++ 有声明、定义和语句。语句就是你可能认为的“代码”:iffor、表达式等。

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

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

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

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

编译器在编译时不能这样做;它是交互式的。并且 C++ 要求在 main 开始之前初始化所有全局变量。所以编译器必须调用main之前的代码。这是完全合法的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    相关资源
    最近更新 更多