【发布时间】:2011-06-20 08:08:54
【问题描述】:
我想在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 编译器套件中找到。每个优化/分析功能都被实现为一次通过。所有这些通行证都是通过静态构造函数注册的。
【问题讨论】:
-
这些函数中是否有任何称为“I_will_explode_if_you_call_me_from_main”的函数?
-
一种可能的解决方法(或解决方案,取决于您的观点)是将您的 C++ 编译器用作更好的 C 编译器;然后你可以挑选静态初始化器等特性。
-
为什么不只是
int main(int argc, char** argv) { DoPreMainStuff(); return ActualMain(argc, argv); } -
像这样滥用 C++ 会让你受伤。在 main 之前不需要做任何事情。在 main() 中初始化全局变量,然后调用 doWork() 并将其作为代码的入口点。
标签: c static-variables