3

「extern」が何をするのかを学ぼうとしています。メインのヘッダーで変数がexternで宣言されている単純なプログラムがあります。主に、その変数が定義されています。Main は、その変数の値を出力するために、別のクラス ファイル (メインのヘッダーが含まれているため、外部変数にアクセスできる必要があります) のメソッドを呼び出します。しかし、コンパイル エラーが表示されます:「未解決の外部シンボル "int myglobal"。

source.cpp ファイルでこの変数への参照を削除すると、コードは正常に実行されます。

ソース.cpp

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

void printGlobal()
{
    std::cout << "Global: " << myglobal;
}

ソース.h

void printGlobal();

main.h

extern int myglobal;

main.cpp

#include "main.h"
#include "Source.h"

int main()
{
    int myglobal = 5;
    printGlobal();
    system("pause");
    return 0;
}
4

2 に答える 2

0

extern および static キーワードはストレージ指定子です。各ストレージ指定子は、基本的に名前に 2 つのプロパティを追加します。 1. 名前の割り当てまたは割り当て解除。2. 可視性。

「C」の名前に「extern」キーワードを追加すると、変数のみが宣言されるため、コンパイラエラーなしでプログラムでその名前を使用できます。extern 変数は、それらが定義されているスコープの外で可視であることを意味します。また、このシンボルは、他のオブジェクト ファイルでシンボル定義を検索するようにリンカーに指示します。したがって、「extern」を myGlobal に追加した場合、「myGlobal」という名前の変数のみを宣言し、プログラムでその名前を使用できました。しかし、リンカーが来ると、その「myGlobal」が定義されている場所を見つけようとしましたが、これを見つけることができず、「未解決の外部シンボル」エラーが発生しました。

すべての extern(グローバル) 変数は、プログラムの開始時に割り当てられ、プログラムの終了時に破棄されます。

AH が提供したもの以外の「extern」の別の使用法:

test1.c
 int myextern = 10;

test2.c

void func1(){
  int extern myextern;
  printf("%d",myextern);
}


静的:
静的変数の割り当て/割り当て解除は、extern 変数と同じです。プログラムの開始時に割り当てられ、プログラムの終了時に破棄されることを意味します。しかし、静的変数の可視性は、それらが宣言されているレキシカル スコープに限定されます。それらはスコープの外では見えません。

于 2013-07-14T04:28:16.637 に答える