如何使用一个“rename”#import属性在tlb文件中重命名12个标识符

时间:2014-03-14 08:53:24

标签: visual-c++ warnings

在将VC ++ 6.0开发的代码迁移到Visual Studio 2008时,我收到了以下警告,指向一行代码。

警告讯息:

1>c:\Test\File1.h(8) : warning C4278: 'GetCurrentDirectory': identifier in type library 'GCRComp.tlb' is already a macro; use the 'rename' qualifier
1>c:\Test\File1.h(8) : warning C4278: 'SetCurrentDirectory': identifier in type library 'GCRComp.tlb' is already a macro; use the 'rename' qualifier
1>c:\Test\File1.h(8) : warning C4278: 'DeleteFile': identifier in type library 'GCRComp.tlb' is already a macro; use the 'rename' qualifier
1>c:\Test\File1.h(8) : warning C4278: 'CreateDirectory': identifier in type library 'GCRComp.tlb' is already a macro; use the 'rename' qualifier
1>c:\Test\File1.h(8) : warning C4278: 'RemoveDirectory': identifier in type library 'GCRComp.tlb' is already a macro; use the 'rename' qualifier
1>c:\Test\File1.h(8) : warning C4278: 'CreateDirectory': identifier in type library 'GCRComp.tlb' is already a macro; use the 'rename' qualifier
1>c:\Test\File1.h(8) : warning C4278: 'GetUserName': identifier in type library 'GCRComp.tlb' is already a macro; use the 'rename' qualifier
1>c:\Test\File1.h(8) : warning C4278: 'GetFullPathName': identifier in type library 'GCRComp.tlb' is already a macro; use the 'rename' qualifier
1>c:\Test\File1.h(8) : warning C4278: 'SearchPath': identifier in type library 'GCRComp.tlb' is already a macro; use the 'rename' qualifier
1>c:\Test\File1.h(8) : warning C4278: 'ShellExecute': identifier in type library 'GCRComp.tlb' is already a macro; use the 'rename' qualifier
1>c:\Test\File1.h(8) : warning C4278: 'DeleteFile': identifier in type library 'GCRComp.tlb' is already a macro; use the 'rename' qualifier
1>c:\Test\File1.h(8) : warning C4278: 'GetTempPath': identifier in type library 'GCRComp.tlb' is already a macro; use the 'rename' qualifier

错误代码行:

#import "GCRComp.tlb" rename_namespace("GCRTools")

我通过使用“rename”属性修复了此问题以获取“GetCurrentDirectory”的第一个警告。代码如下,

#import "GCRComp.tlb" rename_namespace("GCRTools"), rename("GetCurrentDirectory","GetCurrentDirectoryNew")

由于此仅修复了1个警告,如何修复剩余的11个警告,因为挑战是所有11个警告也指向相同的#import代码。

非常感谢您解决此问题的任何帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

显然你已经知道了答案,你需要另外11个重命名指令。使用\反斜杠将它们写在不同的行上。

确实有一个警告胜过它的用处。它被添加到以后的VS版本中,因为预处理器对这些标识符造成的损坏会产生如此难以诊断的错误消息。许多程序员已经失去了一堆头发,试图弄清楚" GetCurrentDirectoryW"来自。或者更糟糕的是,为什么" GetCurrentDirectory()"在他的代码中产生一个未找到的"标识符"编译错误,即使它在类型库和.tlh文件中清晰可见。

但是这不是问题,当你在VC6中编译代码时,这些标识符已经被重命名了。只要它们在整个源代码中始终重命名 并且不在外部可见,那么您就不会遇到问题。这很常见。所以,只需禁用警告并继续您的生活:

#pragma warning(disable: 4278)
#import "GCRComp.tlb" rename_namespace("GCRTools")