2009年4月26日 星期日

#pragma

有寫過C/C++的人應該很常看到這個字,我第一次用它好像是在碩一的時候,當時在練習寫DLL,呼叫DLL裡的function有兩種作法,一種是不需要include .h直接靠LoadLibrary,另一種要include搭配#pragma comment xxxxx。今天,我才想到要去找一下它的意思,這時候不免又要感慨一下自己的程式年齡發展得比別人晚也比別人慢。XD

簡單來說,#pragma是下給compiler看的指令,一些較常用的指令通常都支援跨平台的使用,所以大部份compiler都會看得懂。想當然爾,有些指令就比較特殊,也只有部份compiler看得懂,換個平台可能就無效了。

或許大家會說:用#ifdef不行嗎?furbylin在文章中提到:

#ifdef的方式必須在command line指定一堆定義是很麻煩的, 而且一些特殊能力用#ifdef 也定義不出來. 況且使用你寫的source code的人不見得了解該如何定義以符合他的使用平台或compiler的需求. compiler看到#pragma時如果後面的定義是它不認得的, 它不會理會; 相反的看得懂得compiler就會去執行它.

至於也很常用的 #pragma once ,這種header files的管理還是會建議用 #ifndef 來判斷較好,萬一compiler支援程度不一導致出錯時要再找bug就麻煩了。GCC Doc中曾提到將#pragma once列為"obsolete",不過3.4 release 後GCC有修正其 symbolic and hard links 的行為了。

我怎麼會心血來潮的想找這資料呢?因為開口的 How to Deploy my Visual C++ Applications 一文中有提到OpenMP,我便開始查看這東西是什麼鬼,才發現是用來寫平行程式的,Heresy  在他的blog上很清楚的介紹OpenMP的寫法,其中,便是要透過#pragma向compiler下指令說哪段code要作平行運算。最後我便貼一段他文章上的例子,順便測測PreCode的功能。

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>

void Test( int n )
{
    for( int i = 0; i < 10000; ++ i )
    {
          //do nothing, just waste time
    }
    printf( "%d, ", n );
}

int main(int argc, char* argv[])
{
    #pragma omp parallel for
    for( int i = 0; i < 10; ++ i )
    	Test( i );
    system( "pause" );
}

沒有留言: