1

main.cpp と定数のヘッダーに加えて、2 つの外部ファイルを含むプログラムがあります。したがって、合計で 4 つのファイルになります。次のコードが含まれています。

main.cpp

#include <iostream>
using namespace std;

int ext1_func();
int ext2_func();

int main()
{
    int i;
    i = ext1_func();
    cout <<  i << endl;

    i = ext2_func();
    cout << i << endl;

    return 0;
}

ext1.cpp

#include "const.h"
int asd1=1;

int ext1_func()
{
   return temp_int;

}

ext2.cpp

#include "const.h"
int asd2 = 2;

int ext2_func()
{
   return temp_int;
}

const.h

#ifndef CONST_H
#define CONST_H

const int temp_int=1;

#endif

私の希望は次のとおりです。

1) ext1.cpp で宣言された変数は、ext1.cpp内の関数だけに認識され、ext2.cpp にも認識されます。したがって、「asd1」は「ext1_func」と「ext2_func」の「asd2」にのみ認識されている必要があります。

2) 「exp1.cpp」と「ext2.cpp」の関数は、「const.h」で定義されたすべての値を認識できる必要があります。

私が作成して添付したコードはこれらの要件を満たしていると思いますが、正しく実行できているかどうかお尋ねしたいと思います。私が提案した方法よりも簡単に目的の動作を実現する方法はありますか?

前もって感謝します。

ナイルズ。

4

4 に答える 4

2

コンパイル ユニット レベル内では、「グローバル」スコープで宣言するシンボルはすべて、グローバル変数スペースにリンクされます。

これを回避する古い方法は、それらを static と宣言することでした。新しい方法は、それらを匿名の名前空間に入れることです。そこで静的に宣言することもできます。

ext1.cpp

namespace {
  /*static*/ int asd1=1;  
}

ヘッダーの const は問題ありません。この方法で宣言された定数には特別なステータスがあります。実際、コンパイラはコード内で値を置き換えることができます。ただし、理想的には、グローバルなものを汚染しないように、少なくとも (名前付きの) 名前空間でそれらをラップする必要があります。(const_cast を使用して) 値を変更すると、未定義の動作になります。

それが非 const であり、本当にグローバルが必要な場合 (一般的には良い考えではありません)、ヘッダーで extern キーワードを使用し、そのインスタンスを単一のコンパイル ユニットで作成する必要があります。

于 2012-10-18T11:17:23.977 に答える
2

ext1_func()main.cppでプロトタイプを繰り返す代わりに、ext2_func()関数ごとにヘッダー ファイルを定義し、そこに関数プロトタイプを追加します。

// ext1.h
#ifndef EXT1_H_INCLUDED
#define EXT1_H_INCLUDED

int ext1_func();

#endif // EXT1_H_INCLUDED


// ext2.h
#ifndef EXT2_H_INCLUDED
#define EXT2_H_INCLUDED

int ext2_func();

#endif // EXT2_H_INCLUDED

main.cpp で:

#include "ext1.h"
#include "ext2.h"

ext1.cpp と ext2.cpp では、ソース ファイルに対してのみローカルな変数に匿名の名前空間を使用します。

// ext1.cpp
#include "const.h"
#include "ext1.h"

namespace {

int asd1=1;

} // anonymous namespace


int ext1_func()
{
   return temp_int;   
}

ext_2.cpp についても同様です。

インクルード ガード#pragma onceの代わりに、ヘッダー ファイルで便利なものを使用することもできます。#ifndef/#define

于 2012-10-18T11:18:47.313 に答える
1

ext1.cppおよびの変数をext2.cpp静的に定義して、他のファイルから見られないようにする必要があります。しかし、これは物事を構築するための非常に悪い方法です。代わりに、コードを異なるクラスに分ける必要があります。詳しくはこちらをご覧ください。

于 2012-10-18T11:14:28.300 に答える
1

変数を翻訳単位 (ファイル) に対してローカルにしたい場合は、次.cppのように匿名の名前空間に配置します。

namespace
{
    int local_variable = 1;
}

別の方法として、古い C の方法で行うこともできます。

static int local_variable = 1;

.cppまた、このヘッダー ファイルが含まれるすべてのモジュールで重複するため、ヘッダー ファイルで変数を定義しないでください。で次のように外部として宣言する必要がありますconst.h

extern int external_variable;

そして、対応するconst.cppファイルで次のように定義します。

int external_variable = 1;
于 2012-10-18T11:18:57.910 に答える