"Think in C ++" okuyorum ve sadece extern
beyanı 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 extern
beyanı 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 int
denilen x
var 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 x
derlenen kaynak dosyalardan birinde bulduğu tanımın tüm referanslarını çözecektir . Çalışması için, x
değ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 static
anahtar 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.
extern
file2.cpp içinde olmadan , global_int
sonra 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 extern
içinde C ++ değil de C ve ne zaman dava hakkında söz cevabı yok neden bilmiyorum extern
ile gelir const
C ++.
C ++ 'da, bir const
değ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
extern
tanımlanmadan aynı olup olmadığını kontrol edebilir misiniz ? Bunu global
kaynak 2'deki değeri yazdırarak yapabilirsiniz .
extern
iç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.
extern
Birkaç 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 olduconst
ve C ++ derleyici bunustatic
çeviri birimine yükseltti . Bkz . Örneğin,ariatab.cpp
vekalynatab.cpp
.