1 Aralık 2020 Salı

extern Specifier İle Global Değişken

Giriş
extern anahtar kelimesi bir çok farklı anlama gelebilir. Bu yazıdaki kullanımı global değişken tanımlamak içindir. 

Böylece bir translation unit, bir başka translation unit içinde tanımlı değişkeni kullanabilir. 

1. Cpp Dosyası İçinde Tanımlama, Diğer Cpp Dosyasında Kullanma
Bir .c dosyasında şöyle bir değişken olsun.
int var = 0;
Şöyle yaparız. Böylece bir başka .c dosyasında tanımlı olan değişken kullanılıyor.
extern int var;
int main(void)
{
  var = 10;
  return 0;
}

2. Cpp Dosyasında Tanımlama ve .H Dosyasında extern Etmek

C++17
C++17 ile extern specifier ile global değişken kullanımı da değişiyor

Örnek - C++17 İçin
Eskiden şöyle yapardık
// .h
extern const int MY_CONST;

// .cpp
const int MY_CONST = 5;
Şimdi artık sadece şöyle yapıyoruz. Bu kullanım yerine C++17 ile gelen inline global değişken tercih edilebilir. inline Specifier yazındaki global değişken başlığına bakabilirsiniz
// .h
inline const int MY_CONST = 5;
Örnek
global.cpp dosyasında şöyle yaparız.
boost::lockfree::queue<int> q{100};
std::atomic<int> sum{0};
global.h dosyasında şöyle yaparız.
extern boost::lockfree::queue<int> q;
extern std::atomic<int> sum;
global.h dosyasını dahil eden tüm cpp dosyaları bu değişkenlere erişebilir.

Örnek
Bu örnek ilk örnek ile aynı. Sadece biraz daha karışık.

func.h dosyasına şunu yazalım
typedef struct {
    int (*p1)(int a);
    int (*p2)(int a);
} FuncList;

extern FuncList myFuncList;
func.c dosyasına şunu yazalım
#include <stdio.h>

#include "func.h"

static int p1Thing(int a)
{
    return printf ("-- p1 %d\n", a);
}

static int p2Thing(int a)
{
    return printf ("-- p2 %d\n", a);
}

FuncList myFuncList = {
    p1Thing,
    p2Thing
};
Şöyle çağırırız.
#include "func.h"

int main(int argc, char * argv[])
{
  myFuncList.p1 (1);
  myFuncList.p2 (2);
  return 0;
}

Hiç yorum yok:

Yorum Gönder