在C中创建外部字符数组
如何在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
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中编译和运行),我不知道这是否是一个障碍