【发布时间】:2018-06-21 01:04:51
【问题描述】:
在我的项目中有一些编译错误C2872由于byte的模糊定义,在我设置-Include后,输出显示C2872是由于包含文件:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.12.25827\include\comdef.h
来自我的myado.h 文件之一。
但是,myado.h 的任何地方都没有这样的包含,怎么会被包含呢?
myado.h 做了这样的事情:
#import "C:/Program Files/Common Files/System/ado/msado15.dll" rename("EOF", "adoEOF") rename("BOF", "adoBOF")
#include <icrsint.h> // ADO C/C++ Record Binding Definitions
#define TESTHR(x) if FAILED(x) _com_issue_error(x)
,这里FAILED是一个宏定义在
c:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\shared\winerror.h
而_com_issue_error 定义在
c:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.12.25827\include\comutil.h
是这个原因吗?
但如果是这种情况,由于使用了 marco,头文件是如何包含在内的?
或者,c++ 编译器 Visual Studio 是如何识别宏定义的?
【问题讨论】:
-
显示来自
myado.h的实际代码,而不是类似的代码。 为什么这段代码会有这样的行为?如果我们看不到实际的代码就无法回答。 (import语句是从DLL中导入一个类型库(TLB),那个TLB是给ADO用的,它是基于ActiveX的,它是基于COM的,就是_com*引用的,COM的定义来自comdef .h.) -
@KenWhite 没必要——简单地说,我的代码使用了与 com 相关的东西,但从未直接包含
comutil.h,但是,Visual Studio 编译输出是这样说的,所以comutil.h怎么会不请自来就参加聚会? -
来自导入的 TLB。我以为我在上面解释过。
-
@KenWhite 但代码仅从 C:/Program Files/Common Files/System/ado/ 导入
msado5.dll,没有导入或包含.tlb文件,我也找不到硬盘上的msado15.tlb-- 不过System文件夹中有一些msado20/21/25/26/27/28/60.tlb。 -
TLB 嵌入在 DLL 中。它是通过(奇怪的是)
#import语句从该 DLL 导入的。你认为#import的目的是什么?
标签: c++ macros include-path