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

标签 c static-variables

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

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

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

例如,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/

相关文章:

c - 从 C 中的不兼容指针类型警告返回

c - 存储数组的子集

c - 静态函数范围指针和内存泄漏

c - 使用 malloc() 和 realloc() 时出现信号 11 (SIGSEGV) 错误

c - 实现循环列表以及如何删除列表中的中间节点

c - C 编程中的指针和字符串

C 局部和全局静态变量

ruby-on-rails - 在 Rails Controller 中使用静态变量是个好习惯吗?

c# - C# 中的静态变量

c - 当我们声明静态变量时,编译器实际上做了什么?