C ++是否可以在全局范围内使用代码?

时间:2018-08-16 22:36:38

标签: c++ startup machine-instruction

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

但是,我发现可以通过将函数赋给全局变量来在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;
}

1 个答案:

答案 0 :(得分:14)

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

C ++更加古怪,没有“代码”。 C ++具有声明,定义和语句。语句可能是您认为的“代码”:module Foo module Bar Baz = 42 end const_defined? 'Bar::Baz' #=> true Object.const_defined? 'Bar::Baz' #=> false end if,表达式等。

仅声明和定义可以出现在全局范围内。当然,定义可以 include 表达式。 for定义了一个由表达式初始化的全局变量。

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

您当然可以在a = 5;之前调用函数。太复杂而无法在编译时执行的全局变量构造函数和初始化器必须在main之前运行。例如:

main

编译器在编译时无法执行此操作;它是交互式的。 C ++要求在int b = []() { std::cout << "Enter a number.\n"; int temp; std::cin >> temp; return temp; }() 开始之前初始化所有全局变量。因此,编译器将必须在{main之前调用代码。这是完全合法的。

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