在将vc++ 6.0开发的代码迁移到Visual studio 2008时,我得到了指向一行代码的以下警告:
警告消息:
1>c:TestFile1.h(8) : warning C4278: 'GetCurrentDirectory': identifier in type library 'GCRComp.tlb' is already a macro; use the 'rename' qualifier
1>c:TestFile1.h(8) : warning C4278: 'SetCurrentDirectory': identifier in type library 'GCRComp.tlb' is already a macro; use the 'rename' qualifier
1>c:TestFile1.h(8) : warning C4278: 'DeleteFile': identifier in type library 'GCRComp.tlb' is already a macro; use the 'rename' qualifier
1>c:TestFile1.h(8) : warning C4278: 'CreateDirectory': identifier in type library 'GCRComp.tlb' is already a macro; use the 'rename' qualifier
1>c:TestFile1.h(8) : warning C4278: 'RemoveDirectory': identifier in type library 'GCRComp.tlb' is already a macro; use the 'rename' qualifier
1>c:TestFile1.h(8) : warning C4278: 'CreateDirectory': identifier in type library 'GCRComp.tlb' is already a macro; use the 'rename' qualifier
1>c:TestFile1.h(8) : warning C4278: 'GetUserName': identifier in type library 'GCRComp.tlb' is already a macro; use the 'rename' qualifier
1>c:TestFile1.h(8) : warning C4278: 'GetFullPathName': identifier in type library 'GCRComp.tlb' is already a macro; use the 'rename' qualifier
1>c:TestFile1.h(8) : warning C4278: 'SearchPath': identifier in type library 'GCRComp.tlb' is already a macro; use the 'rename' qualifier
1>c:TestFile1.h(8) : warning C4278: 'ShellExecute': identifier in type library 'GCRComp.tlb' is already a macro; use the 'rename' qualifier
1>c:TestFile1.h(8) : warning C4278: 'DeleteFile': identifier in type library 'GCRComp.tlb' is already a macro; use the 'rename' qualifier
1>c:TestFile1.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代码。
任何帮助解决这个问题是非常感激的。谢谢!
显然您已经知道了答案,您需要另外11个rename指令。使用反斜杠将它们写在不同的行上。
确实有一个点,警告超过了它的有用性。它被添加到后来的VS版本中,因为预处理器对这些标识符造成的损害可能会产生非常难以诊断的错误消息。许多程序员在试图弄清楚"GetCurrentDirectoryW"从何而来的时候都弄丢了头发。或者更糟糕的是,为什么他的代码中的"GetCurrentDirectory()"产生一个"标识符未找到"编译错误,即使它在类型库和.tlh文件中清楚可见。
但这不是你的问题,当你在VC6中编译代码时,这些标识符已经被重命名了。只要它们在整个源代码中一致地重命名为,并且在外部不可见,那么就不会有问题。这是很常见的。所以,取消警告,继续你的生活吧:
#pragma warning(disable: 4278)
#import "GCRComp.tlb" rename_namespace("GCRTools")