传递给main()之前和之后要执行的函数的参数

可以使用__attribute__ ((<attibute>))main()类似constructor (如设置函数)和destructor (如清理函数)之前和之后执行函数。 令我惊讶的是,即使这两个编译运行良好,如果参数也通过。

 #include <stdio.h> void myStartupFunction (int a, int b) __attribute__ ((constructor)); void myDestructorFunction (int a, int b) __attribute__ ((destructor)); void myStartupFunction (int a, int b) { printf("Before main\n"); } void myDestructorFunction (int a, int b) { printf("After main\n"); } int main() { printf("Inside main\n"); return 0; } 

但是由于我无法控制(也许我错了)这两个函数的调用和执行,为什么提供这样的工具。 我的意思是如果有这样一个定义,谁来传递这些函数的参数呢? 如果操作系统调用这两个函数,它决定传递哪些参数?

这是C和POSIX标准(基于C标准)的未定义行为。 程序执行的起点是main , 5.1.2.2.1 。 其他任何事情都不能由标准来保证。

__attribute__语法不是Linux的一部分,甚至不涉及它。 这是一个gcc(也可能是其他类似clang)的扩展,它为静态变量提供了C ++初始化程序。

但是,gcc并不保证你可以在这些扩展中使用标准的库函数。 实际上,它不能,因为它不控制应用程序启动代码,也不控制系统库。

这个启动代码/运行时环境(又名C运行时,“crt”)负责设置静态变量,初始化标准库(例如malloc和朋友的内存管理)等。它也调用这些“构造函数”。

所以,你必须从运行时环境和库中获得保证。如果你想使用这样的结构。 一般来说,还有其他更安全/标准的方法来完成任何你想要的。 例如,显式调用它们或自动生成呼叫。 这样,你也可以完全控制你传递什么参数以及如何。

注意: __attribute__一般与“运行函数”没有关系。 只是为函数(或类型,变量等)添加额外的约束/功能,或者告诉编译器特殊用法。 它只是与您所要求的行为有关的"constructor""destructor"属性。

海湾合作委员会的文件并没有强制要求一个特定的功能签名。 据推测这是留给运行时间。 你可能想检查你的目标环境。