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


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值