21 Mart 2020 Cumartesi

Macro Tanımlama

Giriş
Macro 2 çeşit olabilir.

1. Object Şeklinde macro
Şöyle yaparız.
# define identifier replacement-list new-line
2. Function Şeklinde macro
Şöyle yaparız.
# define identifier lparen identifier-list_opt ) replacement-list new-line
# define identifier lparen ... ) replacement-list new-line
# define identifier lparen identifier-list , ... ) replacement-list new-line
Örnek
Şöyle yaparız.
//well-formed (function-like macro with value)
#define f(x) (x)<NEWLINE>

//well-formed (function-like macro without value)
#define f(x)<NEWLINE>

//well-formed (function-like macro without value)
#define f(x) <NEWLINE>

//well-formed (object-like macro with value)
#define f hello<NEWLINE>

//**ill-formed** (object-like macro without value)
#define f<NEWLINE>

//well-formed (object-like macro without value)
#define f <NEWLINE>
Macro Değeri - Macro Expansion
Eğer macro'ya atanan değer tanımlı değilse 0 kabul edilir. Açıklaması şöyle
After all macro expansion and evaluation of defined and __has_include (since C++17) expressions, any identifier which is not a boolean literal is replaced with the number ​0​ (this includes identifiers that are lexically keywords, but not alternative tokens like and).
Örnek
Elimizde şöyle bir kod olsun
#include <iostream>
#define VALUE foo    

int main() {    
#if VALUE == bar
    std::cout << "WORKS!" << std::endl;
#endif // VALUE
}
Çıktı olarak "WORKS" alırız çünkü foo ve bar tanımlı olmadıkları için 0 değerini alırlar. Yani kod aslında şöyle olurr
#if 0 == 0
Macro ve Eksi İşareti
Örnek
Elimizde şöyle bir kod olsun.
#define A -100

//later..
void Foo()
{
  int bar = -A;
  //etc..
}
Bu kod açılınca (macro expansion) şöyle olur.
int bar = - -100;
Macro Parametrelerini Birleştirmek
Normalde macro parametreleri arasında boşlık olur. Parametreleri birleştirmek için ## ile birleştirme (concat) işlemi yapılır.

Örnek
Şöyle yaparız.
#define M1(a, b) a-b
#define M2(a, b) a##-b

int main()
{
  int i = 0;
  int x = M1(-, i); // interpreted as `int x = --i;`
  int y = M2(-, i); // interpreted as `int y = --i;` 
}


Hiç yorum yok:

Yorum Gönder