📌  相关文章
📜  没有main()的情况下如何编写正在运行的C代码?

📅  最后修改于: 2021-05-25 19:56:06             🧑  作者: Mango

编写一个C语言代码,没有任何主要函数的情况下打印GeeksforGeeks

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

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

因此,我们将使用带有参数的预处理器(在编译之前会处理源代码的程序)指令#define,以给人一种程序运行时无需main的印象。但实际上,它运行时具有隐藏的主要函数。让我们看看预处理器是如何工作的:

向上

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

  1. 使用定义main的宏
    #include
    #define fun main
    int fun(void)
    {
        printf("Geeksforgeeks");
        return 0;
    }
    
    Output: Geeksforgeeks
  2. 使用令牌粘贴运算符
    上面的解决方案中有单词“ main”。如果甚至不允许我们编写main,则可以使用令牌粘贴运算符(有关详细信息,请参见此内容)
    #include
    #define fun m##a##i##n
    int fun()
    {
        printf("Geeksforgeeks");
        return 0;
    }
    
    Output: Geeksforgeeks
  3. 使用自变量宏
    #include
    #define begin(m,a,i,n) m##a##i##n
    #define start begin(m,a,i,n)
      
    void start() {
       printf("Geeksforgeeks");
    }
    
    Output: Geeksforgeeks
  4. 编译期间修改入口点
    #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基础课程》。