编写一个C语言代码,在没有任何主要函数的情况下打印GeeksforGeeks 。
从逻辑上讲,不使用main()函数似乎不可能编写C程序。由于每个程序都必须具有main()函数,因为:-
- 这是每个C / C++程序的入口。
- 所有预定义和用户定义函数都可以通过主函数直接或间接调用。
因此,我们将使用带有参数的预处理器(在编译之前会处理源代码的程序)指令#define,以给人一种程序运行时无需main的印象。但实际上,它运行时具有隐藏的主要函数。让我们看看预处理器是如何工作的:
因此,可以通过以下方式解决它:
- 使用定义main的宏
#include
#define fun main int fun(void) { printf("Geeksforgeeks"); return 0; } Output: Geeksforgeeks
- 使用令牌粘贴运算符
上面的解决方案中有单词“ main”。如果甚至不允许我们编写main,则可以使用令牌粘贴运算符(有关详细信息,请参见此内容)#include
#define fun m##a##i##n int fun() { printf("Geeksforgeeks"); return 0; } Output: Geeksforgeeks
- 使用自变量宏
#include
#define begin(m,a,i,n) m##a##i##n #define start begin(m,a,i,n) void start() { printf("Geeksforgeeks"); } Output: Geeksforgeeks
- 编译期间修改入口点
#include
#include // entry point function int nomain(); void _start(){ // calling entry point nomain(); exit(0); } int nomain() { puts("Geeksforgeeks"); return 0; } Output: Geeksforgeeks
使用命令编译:
gcc filename.c -nostartfiles
(nostartfiles选项告诉编译器避免标准链接)解释:
在正常编译下,_start()的主体将包含对main()的函数调用[此_start()将在正常编译期间附加到每个代码上],因此,如果不存在main()定义,则会导致错误,例如“在函数_start中:
(.text + 0x20):对“ main”的未定义引用。
在上面的代码中,我们所做的是定义了自己的_start()并定义了自己的入口点,即nomain()- 该方法由Aravind Alapati提供
有关其他解决方案,请参见在后台执行C中的main()。
参考:
C语言中的宏和预处理器想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。