在C++源文件的全局范围内编译为汇编指令(是否合法?以前,我的印象是,除了 Ch 编程语言(C/C++ 的解释器(之外,您不能在 C++ 程序的全局范围内拥有代码。代码/指令只能在函数 [句点] 的主体内!
但是,我发现您可以通过将函数分配给全局变量来调用 C++ 中主函数之前的函数!这将涉及汇编代码中的call
指令。还可以将两个变量的总和分配给程序集代码之外的另一个全局变量。这几乎肯定会涉及add
和mov
指示。如果该代码在全局范围内,在任何函数之外,它何时执行?如果+
是类类型的重载运算符,如果它内部有一个 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;
}
你链接到的问题的答案是以简单的方式说话,而不是对构造使用严格的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
开始之前初始化所有全局变量。因此,编译器将不得不在main
之前调用代码。这是完全合法的。
每个C++编译和执行系统都有一些在main
前后调用代码的机制。必须初始化全局变量,并且可能需要调用对象构造函数才能执行该初始化。main
完成后,必须销毁全局变量,这意味着需要调用析构函数。