首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将main重新定义为另一个名称

将main重新定义为另一个名称
EN

Stack Overflow用户
提问于 2018-02-20 14:15:16
回答 3查看 92关注 0票数 1

在C90中,我是否可以重新定义main并为其指定另一个名称,并可能使用#define添加额外的参数

例如,在头文件中包含以下内容:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#define main( void ) new_main( void )

int new_main( void );

头文件在编译时不会显示任何错误。然而,当我尝试用主C文件编译它时,我总是得到一个错误

代码语言:javascript
复制
In function '_start': Undefined reference to 'main'     
EN

回答 3

Stack Overflow用户

发布于 2018-02-20 14:30:15

不,您不能这样做,因为这将违反语言和操作系统标准。名称main及其参数argcargvenviron构成了系统加载器调用约定的一部分。

接下来是一些简单的解释(没有ABI级别,只有API级别)。当您的程序已经加载到内存中并即将启动时,加载程序需要知道要调用哪个函数作为入口点,以及如何将其环境传递给它。如果可以更改main的名称和/或其参数列表,则需要将新调用接口的详细信息传递回加载器。而且没有方便的方法(除了编写自己的可执行加载程序之外)。

代码语言:javascript
复制
In function '_start': Undefined reference to 'main'

在这里您可以看到Linux/POISX ELF加载器接口的实现细节。编译器在幕后将函数_start添加到程序中,这是一个实际的程序入口点。_start的任务是执行大多数使用LibC的程序所共有的额外初始化步骤。稍后调用您的main的是_start。从理论上讲,您可以编写一个有自己的函数_start而没有main的程序,这样就可以了。这不是微不足道的,因为您必须确保默认的_start代码不再附加到您的程序中(没有双重定义),但它是可行的。此外,出于同样的原因,您不能选择_start以外的其他名称。

票数 2
EN

Stack Overflow用户

发布于 2018-06-07 07:08:45

编译单元中存在的#define main new_main不会影响程序启动时实现将调用的函数的名称。无论您定义了什么宏,该实现都将调用一个名为main的函数。

如果要使用这样的#define来防止main()的主声明生成使用该名称的函数,则需要在其他地方包含main()的定义;然后,该替代版本可以调用原始版本。例如,如果原始定义没有使用其参数,并且程序仅通过从main()返回而不是使用exit()退出,则可以将#define main new_main放在main的主定义使用的头文件中,然后在另一个文件中执行类似以下操作:

代码语言:javascript
复制
#include <stdio.h>
#include <conio.h>  // For getch() function.
int main(void)
{
   int result = main();
   printf("\nExit code was %d.  Strike any key.\n", result);
   getch();
   return result;
}

在大多数情况下,最好是在普通的"main“函数中添加任何这样的代码,但是如果包含main的文件是由代码生成工具在每次构建时生成的,或者由于某些其他原因不能修改为包含这样的代码,这种方法可能会很有用。

票数 0
EN

Stack Overflow用户

发布于 2018-06-07 08:15:48

假设您正在使用gcc,将-nostdlib传递给您的程序,然后设置一个新条目,方法是将其传递给gcc,后者将其传递给链接器-Wl,-enew_main。这样做不会让您访问C运行时在调用main之前所做的任何很好的功能,并且您必须自己执行此操作。

您可以查看参考资料,了解在调用main之前发生了什么。

What Happens Before main

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48878986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档