2016-04-13 20 views
1

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 ile

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; 
    ^
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?

cevap

0

Bunlar aynı değil.

extern "C" int foo; 

iki şey yapar: (bu beyanı ancak ve sembol başka modül tarafından belirlenecektir ie) o foo extern beyan ve "C" olarak foo bağlama beyan hangi etkiler sembol adı. Öte yandan

,
extern "C" { 
    int foo; 
} 

sadece o foo beyan C bağlama vardır. Sembolü dışsal olarak ilan etmez, bunun anlamı sadece bir açıklama değil, bir tanımdır. Başka bir deyişle

extern "C" int foo; 

yılında

"... Bu sembol extern yapmaz" (extern anahtar kelime tekrarını not)

extern "C" { 
    extern int foo; 
} 
+1

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

+0

@AnT teşekkürler, ben ifadeyi güncelledim. – AaronI

İlgili konular