__attribute__ ((<attibute>))
可用于执行之前和之后的函数main()
like 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 http://port70.net/~nsz/c/c11/n1570.html#5.1.2.2.1。其他任何事情都超出了标准的任何保证。
The __attribute__
语法不是 Linux 的一部分,甚至与之无关。它是一个 gcc(可能还有 clang 等其他扩展)扩展,它部分地为静态变量提供 C++ 初始化程序。
但是,gcc 不保证您可以在这些扩展中使用标准库函数。实际上,它不能,因为它不控制应用程序启动代码,也不控制系统库。
这个启动代码/运行时环境(又名 C 运行时,“crt”)负责设置静态变量,初始化标准库(例如内存管理)malloc
和朋友)等。它也称这些为“构造函数”。
因此,如果你想使用这样的构造,你必须从运行时环境和库中得到保证。一般来说,还有其他更安全/标准的方法来完成您想要的任何事情。例如。叫他们进来main
显式或自动生成调用。这样你就可以完全控制你传递什么参数以及如何传递。
Note: __attribute__
一般来说甚至与“运行功能”无关。它只是向函数(或类型、变量等)添加额外的约束/功能或告诉编译器特殊用法。这只是"constructor"
and "destructor"
与您要求的行为相关的属性。
The 海湾合作委员会文档 https://gcc.gnu.org/onlinedocs/gcc-4.9.3/gcc/Function-Attributes.html#Function-Attributes不强制要求函数有特定的签名。据推测,这是留给运行时的。您可能想检查您的目标环境。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)