【发布时间】:2019-01-23 22:52:52
【问题描述】:
拥有代码(在 C++ 源文件的全局范围内编译为汇编指令)是否合法?以前,我的印象是,除了 Ch programming language(C/C++ 的解释器)之外,你不能在 C++ 程序的全局范围内有代码。代码/指令只能在函数体内 [句号]!
但是,我发现您可以在 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;
}
【问题讨论】:
-
在伪汇编代码中:
mov 4, a将值 4 移动到恰好存储在内存中的任何位置。 -
您不能在函数之外拥有诸如赋值、循环、if/else 之类的 C++ 代码。正如您的评论所证明的那样,这并不意味着编译器无法在函数之外生成机器代码。
-
所有看似在函数之外运行的代码都会被编译器放置在一个特殊的不可见启动函数中。
-
Scope 是 C++ 的东西,汇编不是。我认为你对它们的卷积感到困惑。
标签: c++ startup machine-instruction