C语言中如何正确声明定义extern char*

时间:2021-11-26 16:48:11
编码环境:Windows XP + Visual Studio 2008。
现有一个foo.h文件,里面代码如下:

/* 我的意图是使下面三个变量都作为字符串使用 */
extern char* a;
extern char* b;
extern char* c;
... // 其他代码使用a、b、c

另有文件foo.c,准备在它里面定义上述三个变量a、b、c,
1. 若定义如下:

char* a = "";
char* b = "";
char* c = "";
... // 其他代码使用a、b、c

char* b = "";语句报 链接错误:
... error LNK2001: unresolved external symbol "char * b" (?b@@3PADA) xxx.obj
我猜想是因为第一次出现b变量的语句 char* b = "";前面出现了变量声明以外的东西,即 char* a = "";这条语句。
似乎第一次声明变量以前不能有方法、赋值、……
2. 针对上述错误,我修改如下,将变量声明放在一起,而且修改后的代码偏离我的需求:

char* a;
char* b;
char* c;
... // 其他代码使用a、b、c
a = 0;
b = 0;
c = 0;

报编译错误: ... error C2040: 'a' : 'int' differs in levels of indirection from 'char *' ...
按照错误提示修改为a = (char *)0、a = (int)0错误均是如此。
3. 怒了,让编译器给a、b、c这些全局变量赋初始值〇。给出代码如下:

char* a;
char* b;
char* c;
... // 其他代码使用a、b、c

结果都报1中的错误。

望大虾们指点!

21 个解决方案

#1


是不是要个#include “foo.h” C语言中如何正确声明定义extern char*

#2


已经#include。
引用 1 楼 xiuxianshen 的回复:
是不是要个#include “foo.h”

#3


按LZ的方式一测试,好像没太大问题?莫非还有其他因素存在?

#4


我菜鸟,进来插一句:
我从来没用过extern,不过就我从书上看到的知识来看,我感觉这个不合法呀。
char* a = "";
char* b = "";
char* c = "";
类型不一致!应该作类型转换吧——(char *)" ".

#5


头文件里面一般是函数声明,变量定义的地方,建议在头文件里面
extern char* a = "";
extern char* b ="";
extern char* c="";

#6


LZ的问题肯定是其它原因引起的. 我是这样做的,没有任何问题:
vs2008下,
foo.h

extern char *a;
extern char *b;
extern char *c;

foo.c

char *a;
char *b;
char *c;

int main()
{
a = 0;
b = 0;
c = 0;
return 0;
}

#7


除了有foo.c文件引用#include "foo.h",
应该还有另一个xxx.cpp的文件也引用#include "foo.h"
根据提示的错误,
error LNK2001: unresolved external symbol "char * b" (?b@@3PADA) xxx.obj,
这个xxx.obj对应的应该是一个c++文件,它生成的符号是b@@3PADA,
楼主改成extern "C" char * b应该可以了。

#8


我继续研究下,貌似我同事也测试通过。
引用 3 楼 yuzl32 的回复:
按LZ的方式一测试,好像没太大问题?莫非还有其他因素存在?

#9


也就是说引起这种错误的是cpp文件?长见识了。我白天再去检查。
引用 7 楼 graymole2010 的回复:
除了有foo.c文件引用#include "foo.h",
应该还有另一个xxx.cpp的文件也引用#include "foo.h"
根据提示的错误,
error LNK2001: unresolved external symbol "char * b" (?b@@3PADA) xxx.obj,
这个xxx.obj对应的应该是一个c++文件,它生成的符号是b@@3PADA,
楼主改成e……

#10


引用 4 楼 ahui132811 的回复:
我菜鸟,进来插一句:
我从来没用过extern,不过就我从书上看到的知识来看,我感觉这个不合法呀。
char* a = "";
char* b = "";
char* c = "";
类型不一致!应该作类型转换吧——(char *)" ".

C风格的字符串定义,这个肯定没问题
我第一反应也是foo.c没有include foo.h
试试extern "C"{}明确制定C语言类型

#11


唉,晚了一步,7楼已经说了

#12


把完整的代码贴来,我怀疑

char* a = "";
char* b = "";
char* c = "";
被你弄成局部变量了,这样外部的extern不到

#13


我把声明改为:

extern "C" char* a;
extern "C" char* b;

出现如下错误:
... error C2059: syntax error : 'string' ...\foo.h 4
引用 7 楼 graymole2010 的回复:
除了有foo.c文件引用#include "foo.h",
应该还有另一个xxx.cpp的文件也引用#include "foo.h"
根据提示的错误,
error LNK2001: unresolved external symbol "char * b" (?b@@3PADA) xxx.obj,
这个xxx.obj对应的应该是一个c++文件,它生成的符号是b@@3PADA,
楼主改成e……

#14


extern "C"
{
    #include "foo.h";
}

#15


仍然报LNK2001错误。
引用 14 楼 rommel0226 的回复:
extern "C"
{
#include "foo.h";
}

#16


引用 15 楼 zhoupo 的回复:
仍然报LNK2001错误。
怀疑你放置extern "C"的地方不对,这样改试试:
#ifdef __cplusplus
extern "C" {
#endif
extern char* a;
extern char* b;
#ifdef __cplusplus
}
#endif

#17


报语法错误。
引用 16 楼 happynxy 的回复:
引用 15 楼 zhoupo 的回复:

仍然报LNK2001错误。

怀疑你放置extern "C"的地方不对,这样改试试:

C/C++ code
#ifdef __cplusplus
extern "C" {
#endif
extern char* a;
extern char* b;
#ifdef __cplusplus
}
#endif

#18


经过多日排查,问题貌似出在一个CUDA代码文件,bar.cu。-_-|||
赞7楼的GrayMole2010,几乎一眼就能看出问题所在。
我这个工程有3中文件组成:.cu, .h, .c,貌似默认为C编译器。
在bar.cu里用到了foo.h里所声明的变量a、b、c,但由于它们是在.c文件里面定义,导致对bar.cu来说它们是unresolved external symbol。[不知道哪位达人也遇到这种情况]
解决方法:
(1)将foo.c文件的作为C++文件编译,在Visual Studio 2008中可以修改
(2)直接将foo.c改为foo.cpp
说白了就是用C++编译器来对付它们,这样能解决unresolved external symbol问题。
但由于我的工程过于庞大,使用该方法未遂,因为有太多与C相关的东东了。
感谢各位的答复!

#19


同样遇到了这样的问题,多谢上面各位大大的回答!

#20


引用 5 楼 tianweishuiguo 的回复:
头文件里面一般是函数声明,变量定义的地方,建议在头文件里面
extern char* a = "";
extern char* b ="";
extern char* c="";


这样做估计会有问题,如果放在头文件的话,导致重复定义

#21


我这几天也被这个问题折磨的要死
我试一下看怎么弄

引用 18 楼 zhoupo 的回复:
经过多日排查,问题貌似出在一个CUDA代码文件,bar.cu。-_-|||
赞7楼的GrayMole2010,几乎一眼就能看出问题所在。
我这个工程有3中文件组成:.cu, .h, .c,貌似默认为C编译器。
在bar.cu里用到了foo.h里所声明的变量a、b、c,但由于它们是在.c文件里面定义,导致对bar.cu来说它们是unresolved external symbol。[不知道哪……

#1


是不是要个#include “foo.h” C语言中如何正确声明定义extern char*

#2


已经#include。
引用 1 楼 xiuxianshen 的回复:
是不是要个#include “foo.h”

#3


按LZ的方式一测试,好像没太大问题?莫非还有其他因素存在?

#4


我菜鸟,进来插一句:
我从来没用过extern,不过就我从书上看到的知识来看,我感觉这个不合法呀。
char* a = "";
char* b = "";
char* c = "";
类型不一致!应该作类型转换吧——(char *)" ".

#5


头文件里面一般是函数声明,变量定义的地方,建议在头文件里面
extern char* a = "";
extern char* b ="";
extern char* c="";

#6


LZ的问题肯定是其它原因引起的. 我是这样做的,没有任何问题:
vs2008下,
foo.h

extern char *a;
extern char *b;
extern char *c;

foo.c

char *a;
char *b;
char *c;

int main()
{
a = 0;
b = 0;
c = 0;
return 0;
}

#7


除了有foo.c文件引用#include "foo.h",
应该还有另一个xxx.cpp的文件也引用#include "foo.h"
根据提示的错误,
error LNK2001: unresolved external symbol "char * b" (?b@@3PADA) xxx.obj,
这个xxx.obj对应的应该是一个c++文件,它生成的符号是b@@3PADA,
楼主改成extern "C" char * b应该可以了。

#8


我继续研究下,貌似我同事也测试通过。
引用 3 楼 yuzl32 的回复:
按LZ的方式一测试,好像没太大问题?莫非还有其他因素存在?

#9


也就是说引起这种错误的是cpp文件?长见识了。我白天再去检查。
引用 7 楼 graymole2010 的回复:
除了有foo.c文件引用#include "foo.h",
应该还有另一个xxx.cpp的文件也引用#include "foo.h"
根据提示的错误,
error LNK2001: unresolved external symbol "char * b" (?b@@3PADA) xxx.obj,
这个xxx.obj对应的应该是一个c++文件,它生成的符号是b@@3PADA,
楼主改成e……

#10


引用 4 楼 ahui132811 的回复:
我菜鸟,进来插一句:
我从来没用过extern,不过就我从书上看到的知识来看,我感觉这个不合法呀。
char* a = "";
char* b = "";
char* c = "";
类型不一致!应该作类型转换吧——(char *)" ".

C风格的字符串定义,这个肯定没问题
我第一反应也是foo.c没有include foo.h
试试extern "C"{}明确制定C语言类型

#11


唉,晚了一步,7楼已经说了

#12


把完整的代码贴来,我怀疑

char* a = "";
char* b = "";
char* c = "";
被你弄成局部变量了,这样外部的extern不到

#13


我把声明改为:

extern "C" char* a;
extern "C" char* b;

出现如下错误:
... error C2059: syntax error : 'string' ...\foo.h 4
引用 7 楼 graymole2010 的回复:
除了有foo.c文件引用#include "foo.h",
应该还有另一个xxx.cpp的文件也引用#include "foo.h"
根据提示的错误,
error LNK2001: unresolved external symbol "char * b" (?b@@3PADA) xxx.obj,
这个xxx.obj对应的应该是一个c++文件,它生成的符号是b@@3PADA,
楼主改成e……

#14


extern "C"
{
    #include "foo.h";
}

#15


仍然报LNK2001错误。
引用 14 楼 rommel0226 的回复:
extern "C"
{
#include "foo.h";
}

#16


引用 15 楼 zhoupo 的回复:
仍然报LNK2001错误。
怀疑你放置extern "C"的地方不对,这样改试试:
#ifdef __cplusplus
extern "C" {
#endif
extern char* a;
extern char* b;
#ifdef __cplusplus
}
#endif

#17


报语法错误。
引用 16 楼 happynxy 的回复:
引用 15 楼 zhoupo 的回复:

仍然报LNK2001错误。

怀疑你放置extern "C"的地方不对,这样改试试:

C/C++ code
#ifdef __cplusplus
extern "C" {
#endif
extern char* a;
extern char* b;
#ifdef __cplusplus
}
#endif

#18


经过多日排查,问题貌似出在一个CUDA代码文件,bar.cu。-_-|||
赞7楼的GrayMole2010,几乎一眼就能看出问题所在。
我这个工程有3中文件组成:.cu, .h, .c,貌似默认为C编译器。
在bar.cu里用到了foo.h里所声明的变量a、b、c,但由于它们是在.c文件里面定义,导致对bar.cu来说它们是unresolved external symbol。[不知道哪位达人也遇到这种情况]
解决方法:
(1)将foo.c文件的作为C++文件编译,在Visual Studio 2008中可以修改
(2)直接将foo.c改为foo.cpp
说白了就是用C++编译器来对付它们,这样能解决unresolved external symbol问题。
但由于我的工程过于庞大,使用该方法未遂,因为有太多与C相关的东东了。
感谢各位的答复!

#19


同样遇到了这样的问题,多谢上面各位大大的回答!

#20


引用 5 楼 tianweishuiguo 的回复:
头文件里面一般是函数声明,变量定义的地方,建议在头文件里面
extern char* a = "";
extern char* b ="";
extern char* c="";


这样做估计会有问题,如果放在头文件的话,导致重复定义

#21


我这几天也被这个问题折磨的要死
我试一下看怎么弄

引用 18 楼 zhoupo 的回复:
经过多日排查,问题貌似出在一个CUDA代码文件,bar.cu。-_-|||
赞7楼的GrayMole2010,几乎一眼就能看出问题所在。
我这个工程有3中文件组成:.cu, .h, .c,貌似默认为C编译器。
在bar.cu里用到了foo.h里所声明的变量a、b、c,但由于它们是在.c文件里面定义,导致对bar.cu来说它们是unresolved external symbol。[不知道哪……