从另一个文件访问 c++ 中的 extern "C"变量
Accessing an extern "C" variable in c++ from another file
我在Windows 7 Pro 64位上使用mingw-w64。在尝试访问外部变量时,在经历了很多痛苦之后,我终于得出了这个结论:
// MultiTest2.h
// Version 1.0.0
// MDJ 2016/04/13
#ifndef MULTITEST2_H
#define MULTITEST2_H
extern "C" {
int iXfer;
int setInt();
}
#endif // MULTITEST2_H
不起作用(我使用'extern"C"'而不仅仅是'extern',因为我正在努力最终链接到程序集代码),但是:
// MultiTest2.h
// Version 1.0.1
// MDJ 2016/04/13
#ifndef MULTITEST2_H
#define MULTITEST2_H
extern "C" int iXfer;
extern "C" int setInt();
#endif // MULTITEST2_H
确实有效!
仅供参考,系统中的另外两个文件是:
// MultiTest2.cpp
// Version 1.0.0
// MDJ 2016/04/13
#include "MultiTest2.h"
int iXfer = 0;
int setInt() {
iXfer = 6253;
return 0;
}
和:
// MultiTest1.cpp
// Version 1.0.0
// MDJ 2016/04/13
#include <iostream>
#include "MultiTest2.h"
using namespace std;
int main() {
setInt();
cout << iXfer << endl;
}
对于MultiTest2.h的1.0.0版本('extern"C"'块中的声明),输入后立即:
g++ -S MultiTest2.cpp
结果是:
MultiTest2.cpp:7:5: error: redefinition of 'int iXfer'
int iXfer = 0;
^
In file included from MultiTest2.cpp:5:0:
MultiTest2.h:12:6: note: 'int iXfer' previously declared here
int iXfer;
^
但是,对于MultiTest2.h的1.0.1版本(单独的"extern"C"声明),以下序列可以完美地工作:
c:workgccWorkMultiTest>g++ -S MultiTest2.cpp
c:workgccWorkMultiTest>g++ -S MultiTest1.cpp
c:workgccWorkMultiTest>g++ -c MultiTest2.s
c:workgccWorkMultiTest>g++ -c MultiTest1.s
c:workgccWorkMultiTest>g++ -o MultiTest.exe MultiTest2.o MultiTest1.o
c:workgccWorkMultiTest>MultiTest
6253
这是某种mingw-w64的特质,还是我在这里错过了什么?
它们不一样。
extern "C" int foo;
做两件事:它声明foo是extern(即,这只是一个声明,符号将由另一个模块定义),它声明将foo链接为"C",这会影响符号名称。
另一方面,
extern "C" {
int foo;
}
仅声明foo具有C链接。它没有将符号声明为extern,这意味着这是一个定义,而不仅仅是一个声明。
换句话说,
extern "C" int foo;
与(注意extern关键字的重复)相同
extern "C" {
extern int foo;
}
相关文章:
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 可视化编译与 C++ 中的 Extern 变量
- 是否可以在不使用 decltype 的情况下推断先前定义的 extern 变量的类型
- 如何与 Cheerp/js 中的 extern 变量接口?
- 从 exe 和 dll 访问静态库中的 extern 变量
- 既然我们有内联变量,extern const 还有用吗?
- 在命名空间 c++ 中正确声明 extern 变量
- 静态变量,后跟同一文件中的 extern
- 为什么我不能在标头中只定义一个非常量 gloabal 变量?如果我使用命名空间,为什么我必须声明它"extern"?
- 在不同的文件中使用相同的变量(使用 extern)
- 模板类静态成员变量在使用'extern template class'语法时的特殊化
- 为什么我应该使用extern关键字来声明命名空间范围中的变量
- 在未包含在任何其他文件中的文件中使用 extern 变量是否有任何可能的用途
- 从另一个文件访问 c++ 中的 extern "C"变量
- 是否必须从其他线程访问 extern 变量
- 命名空间c++中的extern变量
- 在 main() 与全局中定义 extern 变量
- Eclipse/GCC:对 Extern 变量的未定义引用
- 在.so内部定义的extern变量和可执行引线执行未定义的行为
- 使用extern变量时出现问题