在C中创建外部字符数组

在C中创建外部字符数组,c,char,extern,C,Char,Extern,如何在C中创建外部字符数组 我尝试了各种方法来定义char-cmdval[128],但它总是说未定义对“cmdval”的引用 我想在first.c文件中的cmdval中放入一个字符串,并在其他second.c文件中使用它。我尝试使用extern char cmdval[128]添加一个global.h文件,但没有成功 更新: global.h extern char cmdval[128]; first.c #include "global.h" char cmdval[128]; fun

如何在C中创建外部字符数组

我尝试了各种方法来定义
char-cmdval[128]
,但它总是说
未定义对“cmdval”的引用

我想在
first.c
文件中的cmdval中放入一个字符串,并在其他
second.c
文件中使用它。我尝试使用
extern char cmdval[128]
添加一个
global.h
文件,但没有成功

更新:

global.h

extern char cmdval[128];
first.c

#include "global.h"

char cmdval[128];

function(){
   strcpy(cmdval, "a string");
}
#include "global.h"

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

#include "global.h"

char cmdval[128];

function(){
   strcpy(cmdval, "a string");
}
#include "global.h"

function(){
   printf("%s \n",cmdval); //error
}
失败:(“对'cmdval'的未定义引用”

编辑:
我在linux中工作(编辑一个迷你OS xv6,然后在qemu中编译和运行),我不知道它是否是一个障碍

您需要在.h文件中声明它

extern char cmdval[128];
然后在first.c中定义值

char cmdval[128];
然后,任何包含您的.h文件的内容,只要它与first.o链接,都可以访问它

更详细地说,“extern”是指,它将引用一个外部变量……如果不在某处声明cmdval,cmdval将永远不存在,extern引用将永远不会引用任何东西

例如:

全球.h:

extern char cmdval[128];
第一,c:

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

int main() {
  strcpy(cmdval, "testing");
  test();
}
第二,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

second.c中

#include "global.h"

global.h
中定义
extern char cmdval[128]

您应该有一个编译单元,在其中定义
cmdval
变量。
extern
关键字只声明变量存在,而不定义它

将以下行放入
first.c
second.c
或您选择的其他c文件中:

char cmdval[128];

Extern
并不意味着在某个地方找到它,它将变量
链接
更改为
external
,这意味着无论您声明变量多少次,它都引用同一事物

e、 g.这些引用在c(不是c++)中是相同的,默认情况下全局变量的链接是
external

external char cmdval[128];
char cmdval[];
char cmdval[128];
问题是,您应该首先将它们编译成.o,然后将它们链接在一起

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


你确定要编译这两个文件并将它们链接在一起吗?你确定这两个文件都是
.c
.cpp
,而不是两者的混合吗?你真的
#在
second.c
中包含了“global.h”
?我重新检查并确定这两个文件都是
.c
,两者都包含了“global.h”,但不确定是否两者都链接。那么,您究竟如何编译和链接此代码?@Alex-
gcc first.c second.c-o main
但他的示例不完整,请看我回答中的示例“如果它与first.o链接”,这意味着什么?我还需要在second.c中定义char cmdval吗?它们是相同二进制文件的一部分,例如:
gcc first.c second.c-o main
,并且不是,您只声明了一次cmdval,但您仍然需要全局中的extern。将
128
从extern声明中去掉。
extern char cmdval[]
就足够了。如果您在声明中留下一个值,并且定义被更改,声明的值将被忽略。我在linux中工作(编辑一个迷你OS xv6,然后在qemu中编译和运行),我不知道这是否是一个障碍