我想知道是否有可能你能编写两个函数,其中一个函数在main之前执行而另一个函数在main函数之后执行?这是在一个问答比赛中被问到的,我发现很难找到它的答案。
答案 0 :(得分:3)
要在退出处运行内容,您可以使用atexit
#include <stdio.h>
#include <stdlib.h>
void we_are_dying()
{
printf("Get the doctor!\n");
}
int main(void) {
atexit(we_are_dying);
// your code goes here
printf("We are done\n");
return 0;
}
对于在main之前运行的东西我不认为这是可能的。
答案 1 :(得分:0)
GCC(GNU Compiler Collection)编译器为C添加了许多通常被忽视的扩展。 这些添加的扩展可以帮助我们简化C应用程序的开发。其中一个扩展是添加属性。根据指定的属性,我们可以指示编译器专门处理函数或变量。
使用constructor属性,我们可以指定在执行main()
函数之前和之后要执行的函数。请参考下面给出的示例(取自 - https://www.hackerearth.com/notes/c-program-callling-a-function-before-main/)。
#include<stdio.h>
/* Apply the constructor attribute to startFunc() so that it
is executed before main() */
void startFunc (void) __attribute__ ((constructor));
/* Apply the destructor attribute to lastFunc() so that it
is executed after main() */
void lastFunc (void) __attribute__ ((destructor));
void startFunc (void)
{
printf ("startup code before main()\n");
}
void lastFunc (void)
{
printf ("Function after main()\n");
}
int main (void)
{
printf ("In Main Function\n");
return 0;
}
我上面提到的链接显示了另一种实现启动和退出功能的方法。但是gcc不支持#pragma startup ..
#pragma exit ...
。
在gcc和clang中,您应该使用__attribute__((constructor))
和__attribute__((destructor))
代替。