在面向对象语言(C++)中,您可以main()通过使用全局对象或类静态对象来执行代码,并让它们的构造函数运行您想要的代码.
有没有办法在C中这样做?我没有任何具体问题我想解决,我只是好奇.这可能有用的一件事是自动初始化库.
Dan*_*ego 16
你可以做到__attribute__ ((constructor)).我用两个gcc和我测试了下面的例子clang.话虽如此,它不是语言的一部分.
#include <stdio.h>
void __attribute__ ((constructor)) premain()
{
    printf("premain()\n");
}
int main(int argc, char *argv[])
{
    printf("main()\n");
    return 0;
}
它执行以下操作:
$ ./test
premain()
main()
有一些方法可供使用,__attribute__但这些方法对您的编译器非常具体,使用这些方法编写的代码并不是真正可移植的.另一方面,C语言不提供任何启动模块/库.
在C中,逻辑上main()是OS调用的第一个函数.但在调用之前main(),OS调用另一个名为start-upmodule的函数来设置各种环境变量,初始化(未初始化)静态变量,构建堆栈帧(激活记录)并初始化堆栈指针到堆栈区域的开始以及其他任务必须在打电话之前完成main().
假设您正在编写嵌入式系统的代码,其中没有或只有最小的操作系统来执行上述工作,那么您应该探索这些依赖于编译器的选项.除了GCC之外,Turbo-C和Microsoft C编译器还提供了在特定硬件机器中添加代码的功能(fe 8086机器).
换句话说,启动模块不适合程序员.
使用 gcc,您可以通过使用构造函数属性来实现,例如
__attribute__ ((__constructor__)) 
void foo(void) {
        ...
}
这将在 main 之前调用 foo。
注意:这可能无法移植到其他编译器。