2011-02-02 10 views
10

ポインタ自体を揮発性にするために、Cで関数へのポインタを宣言する方法。C:関数への揮発性ポインタを宣言する

static void volatile (* f_pointer)(void*); 

static void (volatile * f_pointer)(void*); 

static void (* volatile f_pointer)(void*); 

なぜ私はこれを聞いていますか?揮発性ポインタについてはhttp://wiki.answers.com/Q/Volatile_example_code_sample_coding_of_volatile_pointerで読んでいます。

揮発ポインタとポインタへの揮発性に問題時々あります

今は、それは volatile変数へのポインタは非常に共通していることが分かりました。 これらの宣言の両方が揮発性の整数へのポインタであることをFOO を宣言:非揮発性変数へ

volatile int * foo; 
int volatile * foo; 

揮発性ポインタは非常に稀である(私は一度それらを使用したと思う)、 しかし、私はより良い先に行くとあなたの構文を与えるだろう:

int * volatile foo; 

だから、私は「揮発性」関数へのポインタではなく機能するように揮発性のポインタを取得したいです。

おかげ

+4

なぜ関数への揮発性ポインタが必要ですか?誰がこのポインタを変更しようとしていますか?あなたは「揮発性」_really_が何を意味するか知っていますか? –

+0

@James McNellis、はい、したいです。このポインタはスレッド0によって変更され、スレッド1..7で関数を開始するために使用されます。間に障壁がありますが、バリヤーに入る前にスレッド0のメモリーにこのポインターをフラッシュするようコンパイラーに指示します。また、スレッド1..7にこのポインタを再読み込みさせたい( 'barrier、pointer read、calling function 'のループがあります)。私は多くのレジスタを利用できるシステムを使用しているので、コンパイラは多くの変数をキャッシュすることがあります。私は正しい? – osgx

+0

バリアが正しく書き込まれていれば、コンパイラは値をキャッシングするべきではありません。つまり、 'volatile'は不要です。 – caf

答えて

11

と思います。アスタリスクよりも変数名に近い修飾子(constまたはvolatile)は、ポインタ自体を変更します。アスタリスクよりも変数名からの修飾子は、ポインタが参照するものを変更します。この場合には、そのため、あなたが持っているでしょう。もちろん、場合を除き

static void * volatile f_pointer(void *); 

、あなたがポインタを返す関数を宣言するのではなく、関数へのポインタを定義するために括弧が必要なこと:

static void (*volatile f_pointer)(void *); 

staticをその場合、ではないであるため、修飾子ではなくストレージクラスです。変数が指しているものではなく、変数自体の記憶域クラスだけを指定できます。 "extern intへのポインタ"や "static intへのポインタ"、 "intへのポインタ"などはありません。ストレージクラス(staticまたはextern)を指定すると、常にが最初にになります。

その他threadsので、私はこのはおそらくは有用ではないだろうことは注目に超えて、ここでそれを繰り返すことはしませんスレッドとvolatileとの関係を議論してきました。

6
static void (* volatile f_pointer)(void*); 
9

cdeclは、この種の問題のために本当に便利になる:CDECLの

$ cdecl 
Type `help' or `?' for help 
cdecl> declare f_pointer as static volatile pointer to function(pointer to void) returning void 
static void (* volatile f_pointer)(void *) 
cdecl> 

出典: "障壁" としてアスタリスクのhttp://cdecl.org/files/cdecl-blocks-2.5.tar.gz

+2

@osgx - http://cdecl.org/ –

+0

@osgxにオンライン版があります。これは多くの開発環境に含まれています。私はソースから鉱山を建てることを覚えているようだが、どこにあるのか覚えていない。 http://cdecl.org/でオンラインで使用できます。 –

+0

ありがとう!あなたはcdeclを含むいくつかのIDEの名前をつけることができますか? (私は、cdeclを含んだIDEが非常にユーザーフレンドリーでなければならないと思う) – osgx

関連する問題