C-lanugage的可攜性是公認的, 可以跨平台執行.
所以各平台之間的compiler應該儘可能的符合可攜性的要求.
但
是為了提高執行效率, 符合各平台的機器特徵做一些特殊動作, 例如撰寫組合語言, 使用co-processor, 使用特殊記憶體配置,
使用特殊的compiler能力...等等會使用到#pragma 的語法以達到目的而又不影響沒有這些能力的平台或compile的編譯.
或
許你會認為用#ifdef也可以達到目的, 但是#ifdef的方式必須在command line指定一堆定義是很麻煩的,
而且一些特殊能力用#ifdef 也定義不出來. 況且使用你寫的source
code的人不見得了解該如何定義以符合他的使用平台或compiler的需求.
compiler看到#pragma時如果後面的定義是它不認得的, 它不會理會; 相反的看得懂得compiler就會去執行它.
如
果你是很專業的程式師, 而且考慮跨平台且讓別人可以用你的source code, 那麼很難用一個範例就可以搞懂, 因為它牽涉很複雜的一些規範,
你可以上www.gnu.org去看看他們的規定, GNU是一些熱心軟體發展的人士, 願意提供原始碼貢獻世界的人組成的團體,
依循他們的規範是比較正確的方向(很有學問的).
如果你只是用你現在的compiler時發現這個compiler有一些特殊功能可以提升你的效率, 只要照著做就對了, 沒有什麼大學問, 因為#pragma最有可能的用法就是啟動compiler的特殊能力而不會造成跨平台時一般能力的執行.
舉個例子說在Microsoft C(MSC)上寫:
#pragma asm 表示後面寫的是組合語言 (加速).
#pragma small 表示小記憶體模式 (DOS朝代memory很珍貴)
Keil C在8031平台時寫:
#pragma registerbank(0) 表示使用bank0 (別的CPU沒有這種東西)
#pragma code 表示const 資料放在ROM裡面 (節省RAM)
我舉與你不同的平台的compiler的例子就是要告訴你#pragma就是可攜性的環境下製造不可攜碼的無奈. 你的CPU也會有一些特殊功能或結構, 不用#pragma怎麼辦.
所以各平台之間的compiler應該儘可能的符合可攜性的要求.
但
是為了提高執行效率, 符合各平台的機器特徵做一些特殊動作, 例如撰寫組合語言, 使用co-processor, 使用特殊記憶體配置,
使用特殊的compiler能力...等等會使用到#pragma 的語法以達到目的而又不影響沒有這些能力的平台或compile的編譯.
或
許你會認為用#ifdef也可以達到目的, 但是#ifdef的方式必須在command line指定一堆定義是很麻煩的,
而且一些特殊能力用#ifdef 也定義不出來. 況且使用你寫的source
code的人不見得了解該如何定義以符合他的使用平台或compiler的需求.
compiler看到#pragma時如果後面的定義是它不認得的, 它不會理會; 相反的看得懂得compiler就會去執行它.
如
果你是很專業的程式師, 而且考慮跨平台且讓別人可以用你的source code, 那麼很難用一個範例就可以搞懂, 因為它牽涉很複雜的一些規範,
你可以上www.gnu.org去看看他們的規定, GNU是一些熱心軟體發展的人士, 願意提供原始碼貢獻世界的人組成的團體,
依循他們的規範是比較正確的方向(很有學問的).
如果你只是用你現在的compiler時發現這個compiler有一些特殊功能可以提升你的效率, 只要照著做就對了, 沒有什麼大學問, 因為#pragma最有可能的用法就是啟動compiler的特殊能力而不會造成跨平台時一般能力的執行.
舉個例子說在Microsoft C(MSC)上寫:
#pragma asm 表示後面寫的是組合語言 (加速).
#pragma small 表示小記憶體模式 (DOS朝代memory很珍貴)
Keil C在8031平台時寫:
#pragma registerbank(0) 表示使用bank0 (別的CPU沒有這種東西)
#pragma code 表示const 資料放在ROM裡面 (節省RAM)
我舉與你不同的平台的compiler的例子就是要告訴你#pragma就是可攜性的環境下製造不可攜碼的無奈. 你的CPU也會有一些特殊功能或結構, 不用#pragma怎麼辦.
