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

2024-04-09

__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(使用前将#替换为@)

参数传递给要在 main() 之前和之后执行的函数 的相关文章

随机推荐