Сигнатура функции:
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' является недопустимым именем символа экспорта.