Giriş
Macro 2 çeşit olabilir.
1. Object Şeklinde macro
Şöyle yaparız.
Şöyle yaparız.
Şöyle yaparız.
Eğer macro'ya atanan değer tanımlı değilse 0 kabul edilir. Açıklaması şöyle
Elimizde şöyle bir kod olsun
Örnek
Elimizde şöyle bir kod olsun.
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.
Macro 2 çeşit olabilir.
1. Object Şeklinde macro
Şöyle yaparız.
# define identifier replacement-list new-line2. 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 ExpansionEğ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ştirmekNormalde 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