2016-08-31 22 views
0

私はこのコードを私に渡して問題を解決していますが、関数の定義の1つを理解することができません。関数の戻り値の型を理解する

void DESC_API ApplDesc(DescMsg* pMsg)

私は関数がvoidが成り立つように、何かを返すイマイチことがわかります。しかしここでDESC_APIは何をしていますか?あなたはDESC_APIが空白に置き換えられ、マクロで見ることができるように、これは、それがヘッダファイル

#if defined(DESC_API) 
#else 
/* No paging used. */ 
#define DESC_API 
#endif 
+0

ビルド中の何かが、コンパイラのコマンドラインでDESC_APIを定義している可能性があります。 –

+0

おそらく何もしません。私は、決して実装されていないか、コンパイル時に注入された何か(以下の答えに記述されているように)のフックかもしれないと思います。どのような問題が解決されているかを見るために、事前処理部分( 'gcc -E'など)だけを実行するようにコンパイラに指示してみましたか?たぶん、何が起こっているのかについてもっと手がかりを与えるでしょう。 – user5728855

答えて

3

DESC_APIのように見えます。可視性マクロです。 MSVCの場合は__declspec(dllexport)または__declspec(dllimport)、gccまたはclangの場合は__attribute__ ((visibility ("default")))と定義されます。

もちろん、それは他のものに定義されているかもしれませんが(もっとも、以下のように)、もっともポピュラーな使用例は単にシンボルの可視性属性です。

gccとclangはデフォルトですべてのシンボルをエクスポートするため、属性は不要で、DESC_APIは空白です。 MSVCに関しては、あなたのビルドシステムは外部で/DDESC_API=__declspec(dllimport)経由でそれを設定するかもしれません。

0

まあで定義されている方法です、たぶん、何もしません、したがって、これはおそらく、しかしこれだけです読みやすさの利便性のために使用するマクロです

+4

注意してください。提示されたコードは、まだ定義されていない場合に限り、「DESC_API」を何も定義していません。 –

1

何も返さない関数とvoid*を返す関数を切り替えるには、DESC_APIのように見えます。

あなたは

#define DESC_API * 

を定義する場合、関数がvoidポインタを返すことになります。それ以外の場合、関数は何も返しません。

もちろん、残りの関数は、DESC_APIという値に基づいて条件付きリターンを実行する必要があります。

+1

おそらく、OPは関数が何も返さないことに注意します。彼はそれに影響を及ぼす条件付きコンパイル指令については言及していないかもしれませんが、マクロの意図された使用が少し異なると思われます。 –

1

マクロは、関数シグネチャに追加の修飾子を挿入できるフックのように見えます。特定の呼び出し規約を使用して関数にマークを付けるなど、特定の状況下で、コンパイラ固有の拡張機能を使用することを目的としていると考える傾向があります。

存在するマクロ定義は条件付きであることに注意してください。マクロが定義されていない場合(以前の定義が別のヘッダーまたはコマンド行オプションから来る場合がある)、定義されたマクロ(空の置換テキスト)を提供します。

関連する問題