1.main函数的原型为int main(int argc, char* argv[], char* env[]),可以打印出传入参数和环境变量。
2.main函数的返回值虽然是int(占4个字节),但却只用了1个字节保存返回值。正确的返回值是0xreturn&0xff.在bash里执行echo $?查看程序退出码。
3.main函数之前执行部分,全局变量构造函数,__attribute__((constructor))func()函数随后运行。
4.main函数之后执行部分,atexit的注册函数,全局变量析构函数,__attribute__((destructor))func()函数等依次执行。
#include <stdio.h> #include <stdlib.h> __attribute__((constructor))void befor_main (void) { printf("%s \n", __func__); return; } __attribute__((destructor))void after_main(void) { printf("%s \n", __func__); return; } void atexit_register(void) { printf("hello, I'm atexit_register \n"); } //aexit在after_main之前执行 int test_atexit() { atexit(atexit_register); return 1; } class Global { public: Global() { printf("hello, I'm constructor of Global\n"); } ~Global() { printf("hello, I'm destructor of Global\n"); } }; Global g_variable;//全局变量,静态变量在编译时就已经分配好了内存的! int main(int argc, char* argv[], char* env[])//main函数的原型 { int i = 0; printf("%s \n", __func__); //printf("Hello World! \n"); //汇编调用puts //printf("%s%s", "hello", "world! \n"); //汇编调用printf for(i = 0; argv[i] != NULL; i++) { //printf("argv[%d] = %s \n", i, argv[i]); //打印出参数 } for(i = 0; env[i] != NULL; i++) { //printf("env[%d] = %s \n", i, env[i]); //打印出环境变量 } test_atexit(); return 1000; //使用echo $?可以打印出退出码。虽然返回类型是int,但返回值只用了一个字节来保存,打印为1000&0xff。 }