在C之前调用main之前的一些函数

我想在main函数之前做一些事情。 我有多个源文件。 在每个文件中,有一些工作需要在main之前完成。 这在C ++中没有问题,但在C语言中存在问题。

在C ++中,这可以通过两种方式完成:

  1. 利用全局类/结构的构造函数。
  2. 将函数调用到全局变量

例如, static const int __register_dummy_ = __AddRegisterMetaInfo(...);

但是,在C中,无论哪种方式都是不可能的。 显然,没有构造函数。 所以,第一种选择本质上是不可能的。

我认为第二种选择是可能的,但不是用C语言编译的(我只用Visual C ++进行了测试。它给出了C2099 。)。 C只允许常量为非自动变量。

有没有办法在main之前调用一些函数?


编辑 :似乎很多人误解了我真正想做的事情。 很抱歉以简单的方式撰写此问题。

我需要做的是实现一种C ++运行时类信息function,就像MFC的方法一样 。 在这种方法中,我需要从所有源代码中获取一些信息。 例如,假设每个源文件都有一个类的定义,我想查看所有信息(例如,类名和父类)。 最简单的方法是在每个文件中放置一个静态构造函数,每个构造函数访问一个全局数据结构并注册其信息。 但是,我也想找到一种方法在C中实现类似的东西。所以,简单地在main调用pre_main_job不能成为我的答案。

请注意,这种滥用静态构造函数的方法也可以在LLVM编译器套件中找到。 每个优化/分析function都作为通过实现。 所有这些传递都是通过静态构造函数注册的。

对于许多特定于编译器的解决方案,您可以查看OpenSSL发行版中的fips_premain.c文件(例如,您可以在一堆地方在线查看)。

MSVC特定部分看起来像( FINGERPRINT_premain是在main之前执行的函数):

 # ifdef _WINDLL __declspec(dllexport) /* this is essentially cosmetics... */ # endif void FINGERPRINT_premain(void); static int premain_wrapper(void) { FINGERPRINT_premain(); return 0; } # ifdef _WIN64 # pragma section(".CRT$XCU",read) __declspec(allocate(".CRT$XCU")) # else # pragma data_seg(".CRT$XCU") # endif static int (*p)(void) = premain_wrapper; /* This results in pointer to premain to appear in .CRT segment, * which is traversed by Visual C run-time initialization code. * This applies to both Win32 and [all flavors of] Win64. */ # pragma data_seg() 

您可以使用特定于编译器的扩展来实现此目的,例如。 gcc允许您使用constructor函数的函数属性 (以及匹配的destructor属性)来使代码在main之前和之后(或exit )运行

假设你没有将C ++与你的C …混合(因为那时你可以在你的c ++类上做静态构造函数,这可能就是你所要求的!)

Crt0是传统上在main()之前调用的特定于平台的运行时设置。 你可以覆盖它,但那很深。

某些嵌入式平台提供了一种_pre_main()_post_main()类型的过程。 但我认为那是非标准的。

真的,你的主要切入点是, main()

如果你控制了Makefile,你可以强迫main成为别的东西,比如

 gcc app.c -Dmain=not_really_main 

然后在真正的main()链接以调用not_really_main()


编辑:另一种方法:gcc链接器有一个名为ENTRY的变量,它是第一个执行的东西,通常是crt0。 再一次,这是相当重量级的,你会非常了解该平台以实现它,但它是另一个你可以“颠覆主要”的地方。

(我知道,这不是原始问题的直接答案;但是,对于正在寻找在main的内容之前执行代码的方法的人来说,它是一个答案)

我听说过一个更好的主意 – 一个,甚至是便携式和可预测的行为 。 在main函数的开头做“想要在main之前”做的事情(或者在main的开头调用你想要的函数)。

如果您控制代码,那么(真的!)不需要像您提出(或引入)的那些脆弱且通常无法维护的黑客。