我从我的同事那里了解到,一个人可以编写和执行一个C程序,而无需编写main()个函数.可以这样做:

my_main.c

/* Compile this with gcc -nostartfiles */

#include <stdlib.h>

void _start() {
  int ret = my_main();
  exit(ret); 
}

int my_main() {
  puts("This is a program without a main() function!");
  return 0; 
}

使用以下命令编译它:

gcc -o my_main my_main.c –nostartfiles

使用以下命令运行它:

./my_main

什么时候需要做这种事?在现实世界中,这是否有用?

推荐答案

符号_start是您的程序的entry point.也就是说,该符号的地址是程序开始时跳转到的地址.通常,名为_start的函数由名为crt0.o的文件提供,该文件包含C运行时环境的启动代码.它设置一些内容,填充参数数组argv,计算有多少个参数,然后调用main.在main返回之后,调用exit.

如果一个程序不想使用C运行时环境,它需要为_start提供自己的代码.例如,Go编程语言的参考实现之所以这样做,是因为它们需要一个非标准的线程模型,这需要堆栈的一些魔力.当你想编写非常小的程序或做非常规事情的程序时,提供你自己的_start也很有用.

C++相关问答推荐

ISO_C_BINDING,从Fortran调用C

strftime函数中%s的历史意义是什么?为什么没有记录?

va_copy的使用是未定义的行为吗?

有没有更简单的方法从用户那里获取数据类型来计算结果

数据包未从DPDK端口传输到内核端口

正在try 将文件/文件夹名从目录 struct 存储到链接列表

测量ARM MCU中断延迟的问题

为什么GCC在每次循环迭代时都会生成一个数组的mov&S使用[]访问数组?(-03,x86)

如何识别Linux中USB集线器(根)和连接到集线器(根设备)的设备(子设备)?

错误:包含文件时类型名称未知

X64:并发写入布尔数组

tick.q中的Kdb+键控表语法

如何在C中使数组变量的值为常量?

将多项式从文件.txt加载到终端时出现问题

当我用scanf(&Q;%S%S%S&Q;,单词0,单词1,单词2)输入多个单词时,除了最后一个单词外,每个单词的第一个字符都丢失了

C编译和运行

是否有单独的缓冲区用于读写库调用?

在printf()中用%.*S格式填充长度为0的字符串是否会调用任何UB?如果是,是哪一个?

未使用sem_open正确初始化信号量

使用替代日历打印日期