从另一个文件访问 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:\work\gccWork\MultiTest>g++ -S MultiTest2.cpp
c:\work\gccWork\MultiTest>g++ -S MultiTest1.cpp
c:\work\gccWork\MultiTest>g++ -c MultiTest2.s
c:\work\gccWork\MultiTest>g++ -c MultiTest1.s
c:\work\gccWork\MultiTest>g++ -o MultiTest.exe MultiTest2.o MultiTest1.o
c:\work\gccWork\MultiTest>MultiTest
6253

这是某种 mingw-w64 特性,还是我遗漏了什么?

它们不一样。

extern "C" int foo;

做两件事:它声明 foo 是外部的(即这只是一个声明,符号将由另一个模块定义),它声明 foo 的链接为 "C",这影响交易品种名称。

另一方面,

extern "C" {
  int foo;
}

仅声明 foo 具有 C 链接。它没有将符号声明为extern,这意味着这是一个定义,而不仅仅是一个声明。

换句话说

extern "C" int foo;

与(注意extern关键字的重复)相同

extern "C" {
  extern int foo;
}