我想在 main
函数之前做一些事情。我有多个源文件。在每个文件中,都有一些工作需要在main
之前完成。这在 C++ 中没有问题,但在 C 中有问题。
在 C++ 中,这可以通过两种方式完成:
- 利用全局类/结构的构造函数。
- 调用一个全局变量的函数
例如,static const int __register_dummy_ = __AddRegisterMetaInfo(...);
然而,在 C 中,这两种方式都不可能。显然,没有构造函数。因此,第一个选项本质上是不可能的。
我认为第二个选项是可能的,但不是用 C 编译的(我只用 Visual C++ 测试过。它给出了 C2099 。)。 C只允许一个常量为一个非自动变量。
有没有办法在main之前调用一些函数?
编辑:似乎很多人只是误解了我真正想做的事情。很抱歉以简化的方式写这个问题。
我需要做的是实现一种 C++ 运行时类信息功能,就像 MFC's approach .在这种方法中,我需要从所有源代码中获取一些信息。例如,假设每个源文件都有一个类的定义,我想查看所有信息(例如,类名和父类)。最简单的方法是在每个文件中放置一个静态构造函数,每个构造函数访问一个全局数据结构并注册其信息。但是,我也想找到一种在 C 中实现类似功能的方法。因此,简单地在 main
中调用 pre_main_job
不能解决我的问题。
请注意,这种对静态构造函数的滥用也可以在 LLVM 编译器套件中找到。每个优化/分析功能都作为一个 channel 实现。所有这些通行证都是通过静态构造函数注册的。
最佳答案
对于许多特定于编译器的解决方案,您可以查看 OpenSSL 发行版中的 fips_premain.c 文件(您可以在许多地方在线查看它,例如 here)。
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()
关于在C中调用main之前的一些函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4880966/