2016-07-19 13 views
7

Więc mam ten fragment koduCzy potrafisz przekonwertować __func__ na wchar_t [] podczas kompilacji?

wchar_t funcName[] = __FUNCTIONW__; 

ale problem jest z __FUNCTIONW__ ma informacji klasy w imię kiedy wszystko czego chcę to nazwa funkcji. Teraz __FUNCTIONW__ po prostu wywołuje _CRT_WIDE(__FUNCTION__) która uświadomiła mi, że mogę zadzwonić _CRT_WIDE(__func__) ale daje błąd „identyfikator L__func__ jest niezdefiniowana”

__func__ jest niejawnie zadeklarowana identyfikatorem, który rozszerza się do zmiennej tablicy znaków zawierający nazwę funkcji, gdy jest on używany wewnątrz funkcji. Został dodany do C w C99. Od C99 §6.4.2.2/1:

identyfikatora __func__ jest niejawnie zadeklarowana przez tłumacza, jak gdyby zaraz po klamrach otwarcia każdej definicji funkcji, deklaracja

static const char __func__[] = "function-name"; 

pojawił którym funkcje -name to nazwa funkcji zamykającej leksykalnie. Ta nazwa jest nieoznakowaną nazwą funkcji.

Rozumiem, że __func_ nie jest makrem i nie ma nic wspólnego z preprocesingiem?

Czy istnieje inny sposób mogę uzyskać wchar_t tablicy w czasie kompilacji?

+0

Prawidłowo, '__func__' nie jest makrem, więc wciśnie przed nim' L', ponieważ makro '_CRT_WIDE' powoduje błąd. –

+0

Z tego samego powodu nie można wykonywać konkatenacji ciągów à la '" Witam, mam na imię "__func__". "' ... – Aconcagua

Odpowiedz

1

Jak cytowany już standard C (w rzeczywistości, to jest zły, musisz C++ standardy, ale nie można znaleźć to samo ...):

static const char __func__[] = "function-name"; 

teraz masz ten sam problem, jak gdyby chciałeś przekonwertować dowolną inną tablicę podczas kompilacji, np. g .:

char buffer[16]; 
// convert to wchar_t[16]? 

int array[4]; 
// convert to double[4]? 

Typ macierzy to int[4]. To jest poprawka. Zajmuje 4 * sizeof (int) bajtów w pamięci, zwykle 16 bajtów dla większości dzisiejszych maszyn, których nie można w magiczny sposób zmienić na 4 * sizeof (podwójne) bajtów, zwykle 32 bajty (byłoby miłą sztuczką, aby uzyskać pamięć upgrade za darmo ...).

Nie ma sposobu na zmianę char const __func__[] na wchar_t[] podczas kompilacji, przepraszam. Z drugiej strony, powinieneś być w stanie używać zwykłych char const tablicę __func__ w wielu miejscach należałoby użyć tablicy wchar_t (tablicy, a nie szeroki ciąg dosłowny!):

std::wofstream ws; ws << __func__; 
wchar_t buffer[64]; swprintf(buffer, sizeof(buffer), L"%s\n", __func__); 

problem będzie z funkcji akceptowania mi. sol. wchar_t * przy braku przeciążenia. Wtedy nie obejdzie się konwersja ciągu w czasie wykonywania (patrz mbstowcs).

Jeśli to nie pomaga, to może być pomysł, jak łatwo to zrobić tylko raz na funkcję:

template <size_t N> 
struct F 
{ 
    wchar_t name[N]; 
    F(char const* func) 
    { 
     mbstowcs(name, func, N); 
    } 
}; 
#define F_INIT static F<sizeof(__func__)> func(__func__) 
#define FUNC func.name 

void foo() 
{ 
    F_INIT; 
    std::wcout << FUNC; 
} 

int main(int argc, char* argv[]) 
{ 
    F_INIT; 
    std::wcout << FUNC; 
    return 0; 
} 

Daj im (szablon + makr), co wydaje się najbardziej odpowiednia nazwa dla ciebie ...

+0

wow to jest bardzo sprytne, korzystając ze statycznych dekompilacji var wewnątrz funkcji. również w mojej pracy konwertowałem na Wstring a następnie na wchar_t * używając konwertera std :: wstring_convert >; std :: wstring ws_func = converter.from_bytes (_ _func_ _); Wspomnij tylko, że ostatnia część b \ c Zastanawiałem się, czy struktura i szablon byłyby potrzebne, gdybym użył narzędzi na std :: wstring i std :: wstring_convert – user1881587

+2

Inna droga, ale zrób to w ten sposób: 'static std :: wstring ws_func (std :: wstring_convert >(). from_bytes (__ func __)); 'Jako statyczny jest konstruowany tylko raz. Konwerter, jako używany tylko w ctorcie, jest skonstruowany tylko raz. W ten sposób nie ma potrzeby stosowania szablonu lub zwykłej struktury. – Aconcagua

+0

Jest łatwiejszy sposób. Co działa dla pliku (https://stackoverflow.com/a/14421702/2532437), działa również dla funkcji. A to sprawia, że ​​kompilator to robi. Nawet jedno wywołanie czasu uruchomienia do mbstowcs. –

Powiązane problemy