C中的主要功能概念

时间:2016-04-30 10:59:42

标签: c

我想知道是否有可能你能编写两个函数,其中一个函数在main之前执行而另一个函数在main函数之后执行?这是在一个问答比赛中被问到的,我发现很难找到它的答案。

2 个答案:

答案 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))代替。