问题描述:
error C2011: “LockTypeEnum”:“enum”类型重定义
error C2011: “DataTypeEnum”:“enum”类型重定义
error C2011: “FieldAttributeEnum”:“enum”类型重定义
error C2011: “EditModeEnum”:“enum”类型重定义
error C2011: “RecordStatusEnum”:“enum”类型重定义
error C2011: “ParameterDirectionEnum”:“enum”类型重定义

问题原因:
上述问题全部是类型重定义,说明是多次定义了这些类型。原因在于命名空间的冲突。

使用例子:
#import "C:\program files\common files\system\ado\msado15.dll"no_namespace rename("EOF","adoEOF")

分析:
这样的导入语句,no_namespace表示没有命名空间,则使命名空间成为全局的,因此很容易产生冲突。如果去掉“no_namespace”,则表示有命名空间,ado的变量不是标准空间的,然而ado的命名空间名你不知道,变量还是无法使用命名空间定义,不过,你可以使用重命名机制定义一个命名空间。

改进例子:
#import "C:\program files\common files\system\ado\msado15.dll"rename_namespace("ado")rename("EOF","adoEOF")
using namespace ado;

改进分析:
通过重命名,得到一个命名空间名,然后用全局using指令,使空间内所有名字可用,即使是重复也是覆盖定义。不过也有隐患,万一覆盖,则程序可能出现很多奇怪的错误,导致很难调试。那进一步的改进就是,用【ado::类型 变量名】这种方式使用,这样安全可靠。

注意问题:
【using namespace ado;和ado::类型 变量名】这两种方式都需要再#import的rename之后立即使用,不能在其他地方使用。否则在其他地方无法识别自己定义的命名空间名字。#import语句在头文件中,这两种方式的引用空间中的名字不可以,但是在实现文件中可以。