函数签名是:
void __stdcall Test(char *,int)
函数内使用的__FUNCDNAME__宏返回修饰函数名:
- 图像内的真实函数名:?Test@@YGXPADH@Z
- __FUNCDNAME__ 返回:?Test@@YGXPADH@Z
当/clr选项打开时(项目 > 属性 > 常规 > 公共语言运行时支持 > /clr)__FUNCDNAME__ 宏不返回真正的修饰函数名称:
- 图像内的真实函数名:?Test@@YGXPADH@Z
- __FUNCDNAME__ 返回:?Test@@ $$F YGXPADH@Z __FUNCDNAME__ 宏不返回真正的修饰函数名。
这使得无法使用#pragma 注释指令直接从代码中导出 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' 是无效的导出符号名称。