#include <iostream>
#include <vector>
using namespace std;
class RunBeforeMain{
public:
static int hello() {
cout<< "Hello world" <<endl;
vector<int> nums(5,9);
for(auto i : nums) {
cout<<i<<endl;
}
return 0;
}
};
int main() {
cout << "Bye, World!" << endl;
return 0;
}
//即使globalVar在main后定义,也会在main执行前被初始化
int globalVar = RunBeforeMain::hello();
//在全局中直接调用类的静态成函数会产生重复声明错误。
//RunBeforeMain::hello();//Declared In: main.cpp
vs2019, gcc10.2输出:
Hello world
9
9
9
9
9
Bye, World!
CLion2020输出:
Bye, World!
总结:
在程序入口(例如main)被调用前,全局变量会被初始化,还会有函数的定义,函数的声明。
上面直接调用类的静态成员函数被当做了声明,导致错误。
为什么会被当做了函数声明,而不是函数调用?
因为如果在这里就可以进行函数调用,那么程序究竟有几个入口?总体的结构会混乱。
为什么间接调用可以?
因为初始化全局变量的时候会进行求值,函数调用。但这种函数调用通常不会使得程序的总体结构混乱。
所以在main前,也可以执行你的代码!