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。
}