Windows 7 Pro 64-bit'de mingw-w64 kullanıyorum. Çalışıyorum, çünkü (Bunun yerine sadece 'extern' arasında 'extern 'C'' kullanıyorumBaşka bir dosyadan C++ extern "C" değişkenine erişme
// 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
işe ETMEZ: Harici değişkenleri erişmeye çalışırken, çok saç yırtılma sonra nihayet bu geldi nihayetinde derleme koduna bağlanır), ancak:
// 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
YAPMAYIN!
Bilginize, sistemdeki diğer iki dosyalar şunlardır:
// MultiTest2.cpp
// Version 1.0.0
// MDJ 2016/04/13
#include "MultiTest2.h"
int iXfer = 0;
int setInt() {
iXfer = 6253;
return 0;
}
ve:
bir 'extern MultiTest2.h (bildirimleri Version 1.0.0 ile// MultiTest1.cpp
// Version 1.0.0
// MDJ 2016/04/13
#include <iostream>
#include "MultiTest2.h"
using namespace std;
int main() {
setInt();
cout << iXfer << endl;
}
"C" hemen girdikten sonra "blok):
g++ -S MultiTest2.cpp
sonucudur:
MultiTest2.h Sürüm 1.0.1 ileMultiTest2.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;
^
Ama (bireysel 'extern "C"' beyanları), aşağıdaki sekans mükemmel çalışıyor:
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 idiosyncracy bu çeşit mı, ya da burada özlediğim bir şey mi var?
aynıdır doğru değildir. Ad alanı kapsamında bildirilen const olmayan nesneler varsayılan olarak harici bağlantıya sahiptir. Zaten "onları dışarıdan yapma" gerekmez. “C” 'nin bu durumda ne yapması, bir * tanımını * tanımlayıcı olmayan bir deklarasyona * dönüştürmez (düz' extern' gibi). – AnT
@AnT teşekkürler, ben ifadeyi güncelledim. – AaronI