2013-03-09 106 views
6

我知道,我以前用过#pragma startup#pragma exit但是当我执行下面的代码只In main输出。任何人都可以告诉我这里发生了什么?#pragma指令编译器是否依赖?

#include<stdio.h> 
#pragma startup A 110 
#pragma startup B 
#pragma exit A 
#pragma exit B 110 

int main() 
{ 
    printf("\nIn main"); 
    return 0; 
} 

void A() 
{ 
    printf("\nIn A"); 
} 

void B() 
{ 
    printf("\nIn B"); 
} 

还是编译器依赖?我正在使用gcc编译器。

回答

5

所有#pragma指令是编译器的依赖性,以及编译器不得不忽略任何不承认(ISO-9899:2011,s6.10.6:“那不被认可的实施任何此类编译被忽略“)。这就是为什么你的程序编译成功。

功能AB不叫,因为......你不给他们打电话。如果你完全理解这一点,请抱歉,但是:通过调用函数main来执行C程序。如果要调用函数AB,则必须在main函数中执行此操作。

(事实上,近期的C标准的版本都推出了少量的STDC编译指示其实现都不得不承认,但这并不重要影响的答案)

+0

thanx好友。但至少我知道如何执行一个函数。 – 2013-03-09 18:26:49

+0

函数A和B使用#pragma指令使用'startup'和'exit'参数进行调用。所以他不必从主函数中明确地调用函数A和B.它会在主函数执行前后自动调用。 – 2017-01-03 08:22:49

2

是的,#pragma指令是编译器相关的。

更具体地说,支持的选项是编译器特定的。一些选项可能被许多或大多数编译器支持,但在很多情况下,这些选项是特定于每个编译器的。

+0

如果它不是由我使用,那么为什么没有把它养编译错误编译器支持?我的意思是,代码执行得很好,但函数'A()'和'B()'没有被调用。这不奇怪吗? – 2013-03-09 18:11:36

+0

这很奇怪......但是我认为这是由编译器决定的,至于如何处理不支持的杂注。 – 2013-03-09 18:17:47

0

所有#pragma指令是实现定义。一度,gcc以相同(通常不希望的)方式对任何和所有#pragma指令作出响应。

1

据我所知,GCC根本不支持启动/退出编译指示。 您必须使用属性才能使用gcc。

__attribute__((constructor)) 
__attribute__((destructor)) 
__attribute__((constructor (PRIORITY))) 
__attribute__((destructor (PRIORITY))) 

这将工作:

#include<stdio.h> 
    void A() __attribute__((constructor(110))); 
    void B() __attribute__((constructor)); 
    void A() __attribute__((destructor)); 
    void B() __attribute__((destructor(110))); 

    int main() 
    { 
     printf("\nIn main"); 
     return 0; 
    } 

    void A() 
    { 
     printf("\nIn A"); 
    } 

    void B() 
    { 
     printf("\nIn B"); 
    }