run 在main前

#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前,也可以执行你的代码!
posted @ 2020-11-19 18:28  fndefbwefsowpvqfx  阅读(72)  评论(0编辑  收藏  举报