2013-03-09 12 views
6

Wiem, że wcześniej użyłem #pragma startup i #pragma exit, ale kiedy wykonam poniższy kod, generuje on tylko In main. Czy ktoś może mi powiedzieć, co się tutaj dzieje?Czy kompilator dyrektyw #pragma jest zależny?

#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"); 
} 

Czy jest to zależne od kompilatora? Używam kompilatora gcc.

Odpowiedz

5

Wszystko #pragma dyrektyw kompilator zależne, a kompilator zobowiązany zignorować żadnej nie rozpoznaje (ISO-9899: 2011, s6.10.6: „Każde takie Pragma który nie jest rozpoznawany przez wdrożenie jest ignorowany . "). Właśnie dlatego Twój program kompiluje się pomyślnie.

Funkcje A i B nie są wywoływane, ponieważ ... nie wywołujesz ich. Przepraszam, jeśli rozumiesz to doskonale, ale: program C jest wykonywany przez wywołanie funkcji main. Jeśli chcesz wywoływać funkcje A i B, musisz to zrobić w ramach funkcji main.

(W rzeczywistości, nowsze wersje standardu C wprowadzono niewielką liczbę STDC pragma których implementacje są zobowiązane do uznania, ale najważniejsze, że nie wpływa na odpowiedź)

+0

stary kumpel. Ale przynajmniej wiem, jak wykonać funkcję. –

+0

Funkcja A i B są wywoływane za pomocą dyrektywy #pragma za pomocą argumentów "startup" i "exit". Nie musi więc bezpośrednio wywoływać funkcji A i B z głównej funkcji. Zostanie on automatycznie wywołany przed i po wykonaniu głównej funkcji. –

2

Tak, dyrektywa #pragma jest zależna od kompilatora.

Dokładniej, obsługiwane opcje są zależne od kompilatora. Niektóre opcje mogą być obsługiwane przez wiele lub większość kompilatorów, ale w wielu przypadkach opcje są specyficzne dla każdego kompilatora.

+0

jeśli nie jest obsługiwana przez kompilator używam to dlaczego nie podniesie błąd kompilacji? Mam na myśli, że kod został wykonany dobrze, ale funkcja "A()" i "B()" nie są wywoływane. Czy to nie dziwne? –

+0

To dziwne, ale myślę, że pozostawiono to w gestii kompilatora, jeśli chodzi o traktowanie pragmy, które nie są obsługiwane. –

0

Wszystkie dyrektywy #pragma są zdefiniowane we wdrażaniu. W tym samym czasie gcc odpowiedziało na wszystkie dyrektywy #pragma w ten sam (ogólnie niepożądany) sposób.

1

O ile mi wiadomo, gcc po prostu nie obsługuje pragma uruchomienia/wyjścia. Będziesz musiał użyć atrybutu , aby działał z gcc.

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

to będzie działać:

#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"); 
    } 
Powiązane problemy