__FUNCDNAME__ возвращает неверное оформленное имя функции - PullRequest
0 голосов
/ 05 апреля 2019

Сигнатура функции:

void __stdcall Test(char *,int)

__ FUNCDNAME __ макрос, используемый внутри функции, возвращает оформленное имя функции:

  • реальное имя функции внутри изображения: ? Test @@ YGXPADH @ Z
  • __ FUNCDNAME__ возвращает: ? Test @@ YGXPADH @ Z

Когда / clr опция включена (Project> Properties> General> Common Language Runtime Support> / clr) Макрос __FUNCDNAME__ не возвращает реальное оформленное имя функции:

  • реальное имя функции внутри изображения: ? Test @@ YGXPADH @ Z
  • __ FUNCDNAME__ возвращает: ? Test @@ $$ F YGXPADH @ Z __FUNCDNAME__ макрос не возвращает реальное оформленное имя функции.

Это делает невозможным использование директивы # pragma comment для экспорта функции из DLL напрямую из кода без украшения имени:

// .h
/*__declspec(dllexport)*/ void __stdcall Test(char *p1, int p2);

// .cpp
void __stdcall Test(char *p1, int p2)
{
    #pragma message("Exporting function " __FUNCTION__ " [" __FUNCDNAME__ "]")
    #pragma comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__)
}

Возвращает ошибку компоновщика. LNK1242 '? Test @@ $$ FYGXPADH @ Z' является недопустимым именем символа экспорта.

...