2013-03-09 108 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"); 
    }