2013-03-09 6 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는 "구현에 의해 인식되지 않는 그러한 pragma는 무시됩니다 "). 그래서 프로그램이 성공적으로 컴파일됩니다.

기능 AB은 호출하지 않기 때문에 호출되지 않습니다. 죄송 합니다만이 점을 잘 이해하고 계시면 C 프로그램은 main 함수를 호출하여 실행됩니다. AB 함수를 호출하려면 main 함수 내에서 호출해야합니다.

는 (사실, C 표준의 최신 버전은 구현이 인식 할 의무가있다 STDC 프라 그마의 작은 숫자를 도입,하지만 중요한 것은 대답에 영향을주지 않습니다), GCC 내가 아는

+0

고맙습니다. 하지만 적어도 함수를 실행하는 방법은 알고 있습니다. –

+0

함수 A와 B는 '시작'및 '종료'인수를 사용하여 #pragma 지시문을 사용하여 호출됩니다. 따라서 그는 함수 A와 B를 주요 함수에서 명시 적으로 호출 할 필요가 없습니다. 주 함수 실행 전후에 자동으로 호출됩니다. –

2

예, #pragma 지시어는 컴파일러에 따라 다릅니다.

보다 구체적으로, 지원되는 옵션은 컴파일러에 따라 다릅니다. 일부 옵션은 많은 컴파일러 또는 대부분의 컴파일러에서 지원할 수 있지만 대부분의 경우 옵션은 각 컴파일러마다 다릅니다.

+0

가 나는 이유는 컴파일 오류가 발생하지 않은 한 후 사용하고 컴파일러에 의해 지원되지 않는 경우? 내 말은, 코드는 잘 실행되지만 함수 'A()'와 'B()'는 호출되지 않는다는 뜻입니다. 이상하지 않니? –

+0

이상하게 들리지만, 지원되지 않는 pragma를 다루는 방법은 컴파일러의 재량에 달려 있다고 생각합니다. –

0

모든 #pragma 지시어는 구현에 따라 정의됩니다. 한 번에 gcc는 동일한 (일반적으로 바람직하지 않은) 방식으로 모든 #pragma 지시문에 응답했습니다.

1

을 단순히 시작/종료 pragma를 지원하지 않습니다. 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"); 
    }