3

の定義を含むヘッダー ファイルが複数のソース ファイルに含まれている場合、 のコンパイル エラーが発生しないのはなぜですか?constmultiple definition

const_in_header_file.h

const int num = 5;
//int x; //Error. Multiple defintion if included from multiple source files.

const_in_header_file_func.cpp

#include <iostream>
#include "const_in_header_file.h"

using namespace std;

void func(void)
{
   cout << "num in func() = " << num << endl;
}

const_in_header_file_main.cpp

#include <iostream>
#include "const_in_header_file.h"

using namespace std;
extern void func(void);

int main()
{
   cout << "num in main() = " << num << endl;
   func();
}
4

3 に答える 3

3

C++ グローバル const では、内部リンケージです。ヘッダー ファイルを cpp ファイルと結合した後 (ヘッダー ファイルは、#include がある cpp ファイルに「挿入」されます)、各コンパイル ユニットはオブジェクト ファイルにコンパイルされ、リンクされます。これらの関数と変数は内部リンケージであり、リンカには表示されません。つまり、const グローバルはこの段階では表示されません。異なるオブジェクト ファイルに 2 つ以上の const がある場合でも、それらは隠されているだけです。外部リンケージ関数と変数を使用する場合にのみ、リンカは宣言と定義を「アセンブル」しようとします。例: extern int a;1 つのコンパイル単位 (.h が挿入された cpp) がある場合。リンカーはその定義を検索します: int a;(external キーワードなし)。2 つ見つかった場合は、再定義エラーが表示されます。

一定の場合、それらはリンカーに隠されているだけです。

于 2012-08-16T04:59:58.133 に答える
0

それが本当に定義であり、宣言ではない場合、コンパイラは定義に何度も遭遇するたびに同じ名前の(グローバル)変数を作成します-そして、リンカーは複数のシンボルをどうするかわかりません結果のオブジェクト コード ファイルに同じ名前が付けられます。

于 2012-08-16T04:40:47.843 に答える
-1

おそらく、ヘッダーファイルを作成したためです...しかし、「ヘッダーガード」を含めることができませんでした。

「ヘッダー ガード」がないと、コンパイル エラーが発生します。もう 1 つの可能性は、「extern」の使用に失敗したことです。これにより、リンク エラーが発生します。

例えば:

#ifndef MY_HEADER_H
#define MY_HEADER_H

extern int myglobal;

#endif

上の2つのリンクを見てください。ガードを追加したり、「extern」を使用しても問題が解決しない場合は、失敗しているコードのスニペットを投稿してください。

于 2012-08-16T04:41:00.867 に答える