2013-03-19 17 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根據類型庫生成一個新的頭文件。