main函数前后

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


 

你可能感兴趣的:(main函数前后)