1. 主页
  2. 文档
  3. C语言教程
  4. C语言案例实战
  5. C语言如何在没有 main() 的情况下编写正在运行的 C 代码

C语言如何在没有 main() 的情况下编写正在运行的 C 代码

编写一个打印52cxydh的 C 语言代码,无需任何main()函数。

从逻辑上讲,如果不使用 main() 函数,编写 C 程序似乎是不可能的。因为每个程序都必须有一个 main() 函数,因为:-

  • 它是每个 C/C++ 程序的入口点。
  • 所有预定义和用户定义的函数都通过 main 直接或间接调用。

因此,我们将使用带有参数的预处理器(一个在编译前处理源代码的程序)指令#define 来给人一种程序在没有主程序的情况下运行的印象。但实际上它以隐藏的主要功能运行。让我们看看预处理器是如何工作的:-

因此,可以通过以下方式解决:-

  • 使用定义 main 的宏
#include<stdio.h>
#define fun main
int fun(void)
{
printf("52cxydh");
return 0;
}
输出: 52cxydh
  • 使用 Token-Pasing Operator
    上面的解决方案中包含单词“main”。如果我们连main都不能写,我们可以使用token-pasing操作符
#include<stdio.h>
#define fun m##a##i##n
int fun()
{
printf("52cxydh");
return 0;
}
输出: 52cxydh
  • 使用参数宏
#include<stdio.h>
#define begin(m,a,i,n) m##a##i##n
#define start begin(m,a,i,n)

void start() {
printf("52cxydh");
}
输出: 52cxydh
  • 编译时修改入口点
#include<stdio.h>
#include<stdlib.h>

// entry point function
int nomain(); 

void _start(){

// calling entry point
nomain(); 
exit(0);
}

int nomain()
{
puts("52cxydh");
return 0;
}
输出:  
52cxydh

使用命令编译:
gcc filename.c -nostartfiles
(nostartfiles 选项告诉编译器避免标准链接)

说明:
在正常编译下,_start() 的主体将包含对 main() 的函数调用 [此 _start() 将在正常编译期间附加到每个代码],因此如果该 main() 定义不存在,它将导致类似“在函数`_start’中的错误:(.text + 0x20):未定义对`main’的引用。
在上面的代码中我们所做的是定义了我们自己的_start()并定义了我们自己的入口点,即nomain()

这篇文章对您有用吗?