2017-09-07 27 views
0

現在、私はライブラリをCヘッダーファイルに含めることを試みています。私に含める何Cヘッダー定義順序/位置

#ifndef SIMULATE_H 
#define SIMULATE_H 

#ifdef __cplusplus 
extern "C" { 
#endif 

#define RAM_SIZE 16320 
#define STRING_SIZE 10 
#define BUFFER_SIZE 100 
long final_hex[RAM_SIZE]; 
char zero[STRING_SIZE]; 
char stringValue[STRING_SIZE]; 
char buffer[BUFFER_SIZE]; 
char checksum[BUFFER_SIZE]; 

#ifdef __cplusplus 
} 
#endif 

#endif /* SIMULATE_H */ 

#include <math.h>」である:ここで は、元のコードは次のようになります。それは非常に簡単なはずですが、私はここにいくつかの疑問を持っている:このコードは、CおよびC++の両方のヘッダファイルにすることができます

  1. どういう意味:私はここにライブラリを含めると

    #ifdef __cplusplus 
    extern "C" { 
    #endif 
    
  2. 、 「extern "C"」の前か後に置かなければなりませんか?注文はここで彼らのために重要ですか?

+0

」をこのヘッダーに含める必要がある理由はありません。 'simulate.h'ヘッダー自体の宣言のどれも' 'ヘッダーを必要としないので、' simulate.h'を含むすべてのファイルは ' '言い換えれば、それは小さな利便性になります。通常は、コンパイル時間を制御し続けるために、ヘッダーを最小限に抑え、自己完結型にします。それはまだ賢明かもしれませんが、それが賢明であることは明らかではありません。 –

+0

はい、コードは、ヘッダがCとC++の両方からの使用を意図していることを意味します。しかし、それは不思議です。関数がないので、 'extern" C "'が何かをしていることは明らかではありません。グローバル変数はタイプセーフなリンケージのためにマングルされていません。 –

+0

「アドオン」を明確にしてください。 'simulate.c'のコードが' 'で宣言された関数を呼び出す場合、Cソースにはヘッダーではなく' 'が含まれていなければなりません。外部ヘッダー(ここでは 'simulate.h')を他のソースファイルで使用できるようにするために必要な他のヘッダーだけを含めるべきです。 'simulate.c'だけが必要とするものは' simulate.c'によって直接インクルードされるべきです。 'simulate.c'に' extern void dump_simulation(FILE * fp、const char * tag、const SimulationState * sim_state);という関数があった場合、 ''をインクルードして 'FILE '。 –

答えて

2

あなたが

#include <math.h> 

ではなく

#define <math.h> 

を追加したい意味ならば、私はそのあなた、あなたと仮定します、私はコメントを追加するには、評判を持っていないが、私は好奇心が強いです意味#include

関数や構造体などのライブラリで定義されたものを使用する必要がある場合は、math.hのような他のライブラリをインクルードします。

プリプロセッサは、#include文になると、#include行をmath.hファイルの内容に置き換えます。

ファイル内の何かがヘッダーファイル内の何かを参照する場合にのみ、ヘッダーファイルをインクルードする必要があります。コードを投稿したヘッダーファイルは、私が見る限り、math.h内のものを参照するものではないので、そのファイルには含めないでください。

代わりに、simulate.hファイルの宣言を使用するソースファイル(* .c)を用意しておく必要があります。おそらくmath.hにはこれらのファイルが両方とも含まれています。

#include "simulate.h" 
#include <math.h> 

int main(void) { 
    double root = sqrt(25.0); /* from math.h */ 
    int n = STRING_SIZE;  /* from simulate.h */ 
} 

限り、あなたの最初の質問に関しては、の#ifdefの_cplusplusはプリプロセッサにだけ条件付きコンパイルディレクティブです。変数_cplusplusが(C++コンパイラを使用して)定義されている場合は、#ifdef/#endifセグメントの間にコードが追加されます。さもなければそれはしません。

simulate.hファイルにmath.hファイルを含める場合、後ほどsimulate.hでmathの何かに参照しないと仮定している限り、その位置は重要ではありません.h前に#include <math.h>

+0

オススメして申し訳ありませんが、明らかにしていません。はい、私は "simulate.h"を含む "simulate.c"にを使用しています。代わりにソースファイル "simulate.c"にが含まれます。ありがとうございました!! –

2

まず、#defineを#includeしないでください。

extern "C" makes a function-name in C++ have 'C' linkage

あなたが調べるとあなたはそれが自分の

#ifdef __cplusplus 
extern "C" { 
#endif 
//... 
#ifdef __cplusplus 
} 
#endif 

セクションのしていることがわかりますMATH.H。 extern "C"セクションの内部に外部ヘッダーを含めない方が良いでしょう。ここで

は良い基本的なexplanation about includesですが、あなたの例に関して:あなたのextern「C」のセクションの前または後に含まれている場合、あなたはそれから何かを使用していないよう

  • は差は現在ありませんヘッダー内にある
  • 外部ヘッダーを使用する場合は、使用前にそのヘッダーを使用する必要があります。それ以外の場合は、
  • math.hの定義または型を使用しない場合は、ネスティングインクルードは必要ではなく、無駄な依存関係を作り出します。プロジェクト間では関係ありません小さな、しかし増加は大規模なプロジェクトで時間を構築する - あなたはむしろあなたの一番上のソースファイル
+0

申し訳ありませんが、私は "#include"を意味していました。リンクと説明をありがとう!この場合、extern "c"セクションの前にインクルードを入れようとします。 3番目の部分については、「math.hの定義や型を使用する予定がない場合は、関数を呼び出すか、またはmath.hの変数を使用することを意味しますか?はいの場合は、math.hから関数を呼び出していますが、 "simulate.c"ファイルにあります。申し訳ありませんが、質問で明確にしていない。 –

+0

"simulate.h"の代わりにライブラリをソースファイル "simulate.c"に含める必要があるようです。助けてくれてありがとう!! –

+0

@Toby Zhou、はい、ヘッダーの中でmath.hからデータ構造や定義を使用する場合を除き、この場合はソースファイルsimulate.cにインクルードする必要があります。 –

3

に個別にそれらのファイルを含める必要があり、私はこのコードの別の側面に焦点を当てるつもりです:

long final_hex[RAM_SIZE]; 

グローバルデータ構造はヘッダファイルにexternと定義する必要があります。そうでなければ、ヘッダーを含む各ソースファイルは、リンク時にエラー(おそらくシンボルfinal_hexの複数定義の行に沿ったもの)を生じる構造体の独自のコピーを定義しようとします。

+0

これを指摘してくれてありがとう!それらをextern変数として定義します。 –