web-dev-qa-db-ja.com

Cでextern char配列を作成する

Cで外部文字配列を作成する方法は?

char cmdval[128]を定義するためにさまざまな方法を試しましたが、常にundefined reference to 'cmdval'と表示されます

文字列をfirst.cファイルのcmdvalに入れて、他のsecond.cファイルで使用したい。 global.hextern char cmdval[128]ファイルを追加しようとしましたが、うまくいきませんでした。

更新:

global.h

extern char cmdval[128];

first.c

#include "global.h"

char cmdval[128];

function(){
   strcpy(cmdval, "a string");
}

second.c

#include "global.h"

function(){
   printf("%s \n",cmdval); //error
}

FAIL :( "` cmdval 'への未定義の参照 "

編集:私はLinuxで作業しています(ミニOS xv6を編集してから、それをqemuでコンパイルして実行します)、それが障壁であるかどうかわかりません

17
SMUsamaShah

.hファイルで宣言する必要があります

extern char cmdval[128];

そして、first.cで値を定義します。

char cmdval[128];

次に、first.oにリンクされている場合、.hファイルを含むすべてのファイルにアクセスできます。

詳しく説明すると、「extern」はこれが参照する外部変数があることを示しています... cmdvalをどこかで宣言しないと、cmdvalは存在せず、extern参照は何も参照しません。

例:

global.h:

extern char cmdval[128];

first.c:

#include "global.h"
char cmdval[128];

int main() {
  strcpy(cmdval, "testing");
  test();
}

second.c:

#include "global.h"

void test() {
  printf("%s\n", cmdval);
}

あなたはこれを使ってこれをコンパイルすることができます:

gcc first.c second.c -o main

または、最初に.oファイルを作成してリンクします

gcc -c first.c -o first.o
gcc -c second.c -o second.o
gcc first.o second.o -o main
30
Geoffrey

Externはどこかで見つけることを意味するのではなく、変数linkageexternalに変更します。つまり、変数を宣言する回数に関係なく、同じものを参照します。 。

例えばこれらはc(c ++ではなく)でも同じことを参照します。デフォルトでは、グローバル変数のリンケージはexternalです。

external char cmdval[128];
char cmdval[];
char cmdval[128];

問題は、まずそれらを.oにコンパイルしてから、それらの.oをリンクすることです。

gcc -c first.c second.c
gcc -o first.o second.o

または

gcc first.c second.c
4
lostyzd

definecmdval変数を含むコンパイル単位が必要です。 externキーワード宣言のみ変数が存在することを定義しません。

次の行をfirst.csecond.cまたは任意の他のCファイルに入れます。

char cmdval[128];
2
user811773

second.c

#include "global.h"

定義extern char cmdval[128] in global.h 同様に。

0
Pete Houston