2013-03-19 68 views
1

假设我们在.cpp文件中定义了一个宏'HELLO',并且我们已经创建了一个.tlb文件。当我在另一个C++项目中导入这个.tlb文件时,我有权访问该宏吗?库(.tlb)文件中的宏的范围?

默认情况下,如果在.c文件中定义了宏,则范围在该文件中。如果宏在.h文件中定义,那么包含它的每个人都可以访问该宏。只是想知道,即使通过.tlb文件行为是相同的.../

回答

3

类型库只存储类型信息(接口&类声明,typedef的,其他元数据),而不是代码。代码的实现是在相应的库(DLL)或服务器(EXE)中定义的。这意味着类型库只告诉客户其中找到代码。他们不提供代码。这就是为什么宏不能导出到tlb的原因。

+0

好吧,如果宏的暴露不是通过tlb's那么什么可能是编译器错误的原因,如http://msdn.microsoft.com/en-us/library/eszd7edh(v=vs.71).aspx – 2013-03-19 10:28:13

+0

警告get不会从类型库中抛出,而是从使用'#import'时C++编译器生成的'tli' /'tlh'文件中抛出。它只是意味着已经定义了另一个符号,它被'tlh'头部的生成覆盖。 – Carsten 2013-03-19 10:37:52

+0

如果我更改.cpp文件(从中生成tlb)中的符号名称,该编译器错误是否会得到修复? – 2013-03-19 11:17:35

1

像Aschratt所说,宏不存储在类型库中。但是,如果您的宏是整数常量,则可以在IDL文件中使用枚举:

enum Colors 
{ 
    White = 1, 
    Yellow = 2, 
    BLue = 3 
} 

这适用于所有语言。例如,如果您在C#中使用类型库,则会将该枚举看作C#枚举。

如果类型库仅用于特定的C++客户端,则可以使用cpp_quote IDL属性在生成的头中发出代码,然后使用#include指令包含该头,而不是使用#import根据类型库生成一个新的头文件。