C++中定义C环境下的变量

static163 2010-09-07 05:06:31
可能没说明白,有个LIB库是C编译器编译出来的,但它里面要使用一个外部变量extern int a;而现在是用VC++调用这个库,必须得给它定义一个变量a,要不编译器报错error LNK2001: 无法解析的外部符号 _a

现在就是编译到这步报错,只知道C++中想用C中的函数或变量时要用extern "C"这样的语句转换,但反过来呢,不知道怎么弄,急。

这个库是下载的,源码倒是有,只是想试着解决一下,不想修改源代码。看有没有方法,C++不熟悉。
...全文
137 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
static163 2010-09-07
  • 打赏
  • 举报
回复
8LOU已经分析过了,我用的库是用C编译器编译出的,在C++工程中调用 的时候就会遇到这样的问题,一般情况下,都是在库中定义好变量,在外部引用,这样用 extern "C" extern int a就可以了,但我下的这个库不行,比较变态,他自己内部不定义,反而让调用者为它定义,所以才用extern __declspec(dllexport) int a;实现。
主要是不想动源码,所以用这种文件解决更好。否则在源码中定义个也可以实现。

谢谢各位。
static163 2010-09-07
  • 打赏
  • 举报
回复
5LOU的兄弟好啊,帮我解决了,刚看C++不久,看来我理解是对的,只是不知道怎么用,谢了。

总结一下,只是理解,不一定准确
C++中使用C环境中的变量用(只是声明而已)
extern "C" extern int a;
extern "C"
{
#include "aaa.h" //这个头文件是C编译的库的头文件
}

C++中定义C环境中的变量用(定义实体)
extern "C"
{
__declspec(dllexport) int a;
}
ZengXianLiang 2010-09-07
  • 打赏
  • 举报
回复
这是两个编译器对标识符处理不同导致的。
咱们写在代码里的名字,例如int a中整型变量a,在编译过程中会做处理,从而在生成的obj文件中可能就不是a了。而C编译器和C++编译器所作的处理是不一样的,所以同一个名字,在两种编译器下生成的obj文件中是不一样的。为了解决这个问题,可以指明都是用C编译器,这样就统一了,具体的命令是在相关代码行前添加extern "C",对于多行的代码也可以使用大括号,如下
extern "C" {
int a;
...
}
本文中的问题中指出LIB文件是C编译器产生的,那么与这个LIB要统一的变量需要使用C编译器来处理名字,又LIB要使用外面定义的变量,咱们要做的就是定义这个变量,并指明使用C编译器来处理标识符,代码如下:
extern "C" int a = 0;
justkk 2010-09-07
  • 打赏
  • 举报
回复
h1.c
#include <stdio.h>
extern int a;
void foo(void)
{
printf("a=%d\n", a);
}


h2.cpp
#include <stdio.h>
int a = 487;
extern "C" void foo(void);
int main(void)
{
foo();
}


gcc -c h1.c
g++ h2.cpp h1.o
可以成功编译,运行的
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 static163 的回复:]

楼上两位说的,都试过,在题目中我已经说了,用extern "C"这样的方式不行,我觉得这个意思刚好是它的反过来
[/Quote]
那准是你的方法有问题
我这里就没问题。
arong1234 2010-09-07
  • 打赏
  • 举报
回复
啊,你说的是反的,应该是
extern "C"
{
__declspec(dllexport) int a;
}
[Quote=引用 4 楼 arong1234 的回复:]
他是已经存在的变量,应该是

extern "C"
{
extern int a;//注意前面的extern和上面的extern "C"
};

引用 2 楼 akirya 的回复:
试试在CPP中

C/C++ code
extern "C"
{
int a;
}
[/Quote]
arong1234 2010-09-07
  • 打赏
  • 举报
回复
他是已经存在的变量,应该是

extern "C"
{
extern int a;//注意前面的extern和上面的extern "C"
};[Quote=引用 2 楼 akirya 的回复:]
试试在CPP中

C/C++ code
extern "C"
{
int a;
}
[/Quote]
static163 2010-09-07
  • 打赏
  • 举报
回复
楼上两位说的,都试过,在题目中我已经说了,用extern "C"这样的方式不行,我觉得这个意思刚好是它的反过来
  • 打赏
  • 举报
回复
试试在CPP中
extern "C"
{
int a;
}
justkk 2010-09-07
  • 打赏
  • 举报
回复
直接定义不行吗?

64,687

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧