"Think in C ++" okuyorum ve sadece externbeyanı tanıttı . Örneğin:
extern int x;
extern float y;
Sanırım anlamını anlıyorum (tanımsız beyan), ama ne zaman yararlı olduğunu merak ediyorum.
Birisi örnek verebilir mi?
"Think in C ++" okuyorum ve sadece externbeyanı tanıttı . Örneğin:
extern int x;
extern float y;
Sanırım anlamını anlıyorum (tanımsız beyan), ama ne zaman yararlı olduğunu merak ediyorum.
Birisi örnek verebilir mi?
Yanıtlar:
Global değişkenleriniz olduğunda bu yararlı olur. Sen beyan varlığını başlığını içeren her kaynak dosyası bunu biliyor böylece, bir başlıkta küresel değişkenler, ama yalnızca bir kez kaynak dosyalarından birini kullanarak “define” gerekir.
Netleştirmek için, kullanan extern int x;türünde bir nesne olduğu derleyici söyler intdenilen xvar bir yerlerde . Nerede olduğunu bilmek derleyicilerin işi değil, sadece türünü ve adını bilmesi gerekir, böylece nasıl kullanılacağını bilir. Tüm kaynak dosyalar derlendikten sonra, linker xderlenen kaynak dosyalardan birinde bulduğu tanımın tüm referanslarını çözecektir . Çalışması için, xdeğişken tanımının “harici bağlantı” olarak adlandırılan şeye sahip olması gerekir, bu da temel olarak bir işlevin dışında (genellikle “dosya kapsamı” olarak adlandırılır) ve staticanahtar sözcük olmadan bildirilmesi gerektiği anlamına gelir .
#ifndef HEADER_H
#define HEADER_H
// any source file that includes this will be able to use "global_x"
extern int global_x;
void print_global_x();
#endif
#include "header.h"
// since global_x still needs to be defined somewhere,
// we define it (for example) in this source file
int global_x;
int main()
{
//set global_x here:
global_x = 5;
print_global_x();
}
#include <iostream>
#include "header.h"
void print_global_x()
{
//print global_x here:
std::cout << global_x << std::endl;
}
Birkaç modül arasında bir değişkeni paylaştığınızda kullanışlıdır. Bir modülde tanımlarsınız ve diğerlerinde extern kullanırsınız.
Örneğin:
file1.cpp dosyasında:
int global_int = 1;
file2.cpp dosyasında:
extern int global_int;
//in some function
cout << "global_int = " << global_int;
global_int, global isim alanında herhangi bir gotchas var mı? ienamespace XYZ{ void foo(){ ::global_int++ } };
abc.h, bunun tanımlanması için iyi bir şans vardır abc.cpp. İyi bir IDE her zaman yardımcı olacaktır, ancak iyi organize edilmiş kod her zaman daha iyi bir çözümdür.
externfile2.cpp içinde olmadan , global_intsonra dahil sonra erişebilirsiniz . neden ona ihtiyacım var?
Her şey bağlantıyla ilgili .
Önceki cevaplar hakkında iyi açıklamalar sağlamıştır extern.
Ama önemli bir nokta eklemek istiyorum.
Sen hakkında sormak externiçinde C ++ değil de C ve ne zaman dava hakkında söz cevabı yok neden bilmiyorum externile gelir constC ++.
C ++ 'da, bir constdeğişken varsayılan olarak dahili bağlantıya sahiptir (C gibi değil).
Yani bu senaryo bağlantı hatasına yol açacaktır :
Kaynak 1:
const int global = 255; //wrong way to make a definition of global const variable in C++
Kaynak 2:
extern const int global; //declaration
Bunun gibi olması gerekir:
Kaynak 1:
extern const int global = 255; //a definition of global const variable in C++
Kaynak 2:
extern const int global; //declaration
externtanımlanmadan aynı olup olmadığını kontrol edebilir misiniz ? Bunu globalkaynak 2'deki değeri yazdırarak yapabilirsiniz .
externiçinde atlanırsa const int global = 255;.
Bu, global bir değişkene sahip olmak istediğinizde kullanışlıdır. Bazı kaynak dosyadaki genel değişkenleri tanımlar ve bir başlık dosyasında extern olarak bildirirsiniz, böylece o başlık dosyasını içeren herhangi bir dosya aynı global değişkeni görür.
externBirkaç kez bir tanım sağlamak zorunda kaldım . Microsoft araçları, başka bir kaynak dosyadaki tablolar yalnızca tanımlandığında eksik semboller için bir bağlantı hatası üretti. Sorun, tablo olduconstve C ++ derleyici bunustaticçeviri birimine yükseltti . Bkz . Örneğin,ariatab.cppvekalynatab.cpp.