2016-12-26 8 views
5

私はC++の関数ポインタの構文を理解しようとしています。私が入力したときのLinuxのEclipseで:C++のvoid(*)は何かを意味しますか?

void(*); 

それは構文エラーを示すメッセージで強調表示されましたが、コンパイルしてプログラムを実行させました。その後Visual Studioで試してみましたが、 "Expected an expression"と言ってコンパイルされません。しかし、奇妙なことは私がそうするときです:

std::vector<void(*)> myVector; 

これはVisual Studioでうまくコンパイルされます。また、いくつかのオンラインコンパイラvoid(*);それ自身でうまく動作します。私はことを知っている..

void (*)(); 

...

は関数ポインタであり、
void(); 

...あなたが行うことができる理由である関数のシグネチャは、次のとおりです。

std::function<void()> func; 

関数ポインタの構文を理解するのに苦労しています。

ありがとうございました。

+0

どのコンパイラが 'void(*);'を受け入れますか? –

+0

これはhttps://ideone.com/lEeMY3とhttp://www.cpp.sh/ですが、これはhttp://codepad.org/Zl1UQRa3ではありません。 Visual Studioはstd :: vector宣言/定義でそれを受け入れます。不思議なことに、GCCを使ってEclipseでそれをエラーとしてハイライト表示しますが、コンパイルして実行します。 – Zebrafish

+0

これは、コンパイラのバグや言語拡張、またはその組み合わせのように聞こえます。私は '-pedantic-errors'フラグの有無にかかわらずg ++を試してみることをお勧めします。 Ideoneでは 'int(**);'という文がコンパイルされますが、 'int;'、特に 'int **;'はコンパイルされません。 –

答えて

12

カッコは、特定のものの優先順位を変更するために使用できます。だから、void (*)()にアスタリスクの括弧があるのは、それがvoid *()とは非常に異なるからです。

void(*)の場合、かっこはそのような優先順位を変更する括弧です。しかし、彼らは必要ではありません。タイプvoid(*)は、void*です。単純でシンプルです。

文脈あなたがそれを使用する場所は重要です。

+0

括弧が優先順位のものであり、同じことを意味する場合、私が試した2つのオンラインコンパイラで、括弧を外すとコンパイルされないというのは奇妙なので、面白いです。 – Zebrafish

+0

この仮説(私がこれを書いている時の答え)は、Ideone 'void(*);'コンパイルでは 'void *;'でコンパイルされたという事実とは一致しません。それが行く限りそれはいいですが、それは説明を提供しません。 –

+0

@ Cheersandhth.-Alfその部分は単なるコンパイラのバグです。 –

関連する問題