Giriş
__func__ derleyici tarafından sunulan bir değişken. Açıklaması şöyle. C++11 ile geliyor.
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.
__func__ derleyici tarafından sunulan bir değişken. Açıklaması şöyle. C++11 ile geliyor.
Metodu girip çıktıgımızı anlamak için şöyle yaparız.The identifier __func__ is implicitly declared by the translator as if, immediately following the opening brace of each function definition, the declarationstatic 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.
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