拥有代码(在C ++源文件的全局范围内编译为汇编指令)是否合法?以前,我的印象是,除了Ch programming language(C / C ++的解释程序)之外,您不能在C ++程序的全局范围内使用代码,而代码/指令只能在[period]函数体内!
但是,我发现可以通过将函数赋给全局变量来在C ++中的主函数之前调用函数!这将在汇编代码中包含一条call
指令。您也可以将两个变量的和分配给汇编代码之外的另一个全局变量。几乎可以肯定会涉及到add
和mov
指令。而且,如果该代码在任何函数之外的全局范围内,它将在何时执行?如果+
是一个类类型的重载运算符,如果它里面有一个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;
}
答案 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
完成后,必须销毁全局变量,这意味着需要调用析构函数。