从另一个文件访问 c++ 中的 extern "C"变量

Accessing an extern "C" variable in c++ from another file

本文关键字:extern 变量 中的 c++ 另一个 文件 访问      更新时间:2023-10-16

我在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;
}