16 Aralık 2016 Cuma

__func__ Değişkeni

Giriş
__func__ derleyici tarafından sunulan bir değişken. Açıklaması şöyle. C++11 ile geliyor.
The identifier __func__ is implicitly declared by the translator as if, immediately following the opening brace of each function definition, the declaration
static const char __func__[] = "function-name";
appeared, where function-name is the name of the lexically-enclosing function. This name is the unadorned name of the function.
Metodu girip çıktıgımızı anlamak için şöyle yaparız.
struct FunctionLogger {
  FunctionLogger(const char* func)
    : m_func(func)
  {
    cout << func <<endl;
  }
  ~FunctionLogger() {
    cout << m_func << endl;
    }
  const char* m_func;
  
};
Kullanmak için şöyle yaparız.
void MyClass::SomeFunc()
{
  FunctionLogger _(__PRETTY_FUNCTION__);
  //Some code
}
Sınıfı macro haline getirip kullanmak için şöyle yaparız.
#define FL FunctionLogger _(__PRETTY_FUNCTION__)
Bu sefer macroyu kullanmak için şöyle yaparız.
void MyClass::SomeFunc()
{
  FL;
  //Some code
}
__FUNCTION__
C++11 desteği olmayan daha eski bir derleyici kullanıyorsak bazı derleyiciler __FUNCTION__  değişkenini sunuyor.

__PRETTY_FUNCTION__ değişkeni
gcc kullanıyorsak, bu derleyici __PRETTY_FUNCTION__ extension değişkenini sunuyor.
Aradaki farkı görmek için şöyle yaparız. gcc sadece metod ismini değil, tüm metod imzasını veriyor.
$ cat test.cpp 
#include <iostream>

int main(int argc, char **argv)
{
    std::cout << __func__ << std::endl
              << __FUNCTION__ << std::endl
              << __PRETTY_FUNCTION__ << std::endl;
}
$ g++ test.cpp 
$ 
$ ./a.out 
main
main
int main(int, char**)
Ayrıca tüm isim alanını da verir. Aradaki farkı görmek için şöyle yaparız.
#include <iostream>

namespace N {
    class C {
        public:
            template <class T>
            static void f() {
                std::cout << __func__ << std::endl
                          << __FUNCTION__ << std::endl
                          << __PRETTY_FUNCTION__ << std::endl;
            }
    };
}

int main() {
    N::C::f<int>();
}
Çıktı olarak şunu alırız.
f
f
static void N::C::f() [with T = int]









Hiç yorum yok:

Yorum Gönder