问一个有关__declspec(dllexport)的问题

时间:2021-11-22 23:15:30
在DLL中定义了这样的一个结构体
#ifdef XMLSERIALIZATION_EXPORTS
#define XMLSERIALIZATION_API __declspec(dllexport)
#else
#define XMLSERIALIZATION_API __declspec(dllimport)
#endif

struct XMLSERIALIZATION_API layerAttSel
{
_bstr_t attQuestion;
};
结构体中的其他部分因为与问题无关,我都已经省略了。问题是:在编译这个DLL的时候出现了一个warning(C4251),大概的意思是说:
    layerAttSel这个结构都export了,然而_bstr_t这个类却没有dllexport的标识,客户可能无法正常使用你的结构!

请问:
    为什么会出现这个warning呢?定义一个_bstr_t*就不会有这样的问题,这是为什么?到底dllexport的意义是什么呀?
    我的主要目的是在结构体中提供一个可变长度的字符,请问如果不想出现warning,该怎么修改?我不用MFC的。

9 个解决方案

#1


出现warning不是由于 __declspec(dllexport) 引起的,你需要 #include <comutil.h>,在comutil.h中才定义了 _bstr_t
这里的 struct 加上 dllexport 应该是没有意义的,因为没有导出任何实体,dllexport在这里可能会被编译器忽略

#2


如果我在这个头文件中没有#include <comutil.h>,那就不是warning了,我肯定包含了撒!
这个struct肯定是有意义的,我都说了,其它与问题无关的地方我都已经省略了,就是这个公有的成员变量,因为在类的定义上加了__declspec(dllexport)了之后才有这个警告的。

还有:为什么定义一个_bstr_t* 就不会有警告,而定义一个变量就有呢?

#3


个人认为:
指针是标准类型,不管是什么类型的指针长度都是相同的,编译器能够获知其入栈、出栈的方式
而导出时并未为_bstr_t生成任何符号链接,因此在导出时产生此警告意在提醒开发人员
不过使用时,只要用户使用相同的结构定义仍然是可以正常使用的
-----------------------------
根据上面的分析,需要修正未导出任何实体的说法,这种情况下是会导出layerAttSel符号链接的

不过我也不确认这样的分析是否正确,希望后面的兄弟能够斧正

#4


结构体有必要导出吗?直接就可以用吧。

#5


gohappy_1999(碧水蓝天)都说了很多遍了,结构中的其他部分已经省略了,怎么老是看贴不注意呢?
qrlvls( 空 气 )说得关于指针的问题,似乎有些道理,不过我还是不怎么懂呀!

#6


A base class or structure must be declared with the __declspec(dllexport) keyword if a function in a derived class is to be exported.


这是msdn的解释
个人认为,结构不用导出,没有必要

#7


结构体导出的情况倒是有一种,结构体中也可以声明函数,而这些函数体必须有一个实体,此时导出结构体是有必要的

#8


qrlvls(空 气)
是啊!
我这个结构体中是有函数的,因为结构体的默认是公有的撒!
所以成员变量也导出了,所以那个对象成员变量就出了问题.但我认为只要客户代码有那个类型定义的头文件就不会出问题的,所以这个警告我没有去管它,不知道会不会出问题呢?

#9


理论上应该不会有问题,因为在编译时,结构体的成员函数对成员变量的操作是通过定义时的偏移进行的,因此在编译后只要结构体的定义前后一致就没有问题
不过为了安全起见,你可以稍加测试

#1


出现warning不是由于 __declspec(dllexport) 引起的,你需要 #include <comutil.h>,在comutil.h中才定义了 _bstr_t
这里的 struct 加上 dllexport 应该是没有意义的,因为没有导出任何实体,dllexport在这里可能会被编译器忽略

#2


如果我在这个头文件中没有#include <comutil.h>,那就不是warning了,我肯定包含了撒!
这个struct肯定是有意义的,我都说了,其它与问题无关的地方我都已经省略了,就是这个公有的成员变量,因为在类的定义上加了__declspec(dllexport)了之后才有这个警告的。

还有:为什么定义一个_bstr_t* 就不会有警告,而定义一个变量就有呢?

#3


个人认为:
指针是标准类型,不管是什么类型的指针长度都是相同的,编译器能够获知其入栈、出栈的方式
而导出时并未为_bstr_t生成任何符号链接,因此在导出时产生此警告意在提醒开发人员
不过使用时,只要用户使用相同的结构定义仍然是可以正常使用的
-----------------------------
根据上面的分析,需要修正未导出任何实体的说法,这种情况下是会导出layerAttSel符号链接的

不过我也不确认这样的分析是否正确,希望后面的兄弟能够斧正

#4


结构体有必要导出吗?直接就可以用吧。

#5


gohappy_1999(碧水蓝天)都说了很多遍了,结构中的其他部分已经省略了,怎么老是看贴不注意呢?
qrlvls( 空 气 )说得关于指针的问题,似乎有些道理,不过我还是不怎么懂呀!

#6


A base class or structure must be declared with the __declspec(dllexport) keyword if a function in a derived class is to be exported.


这是msdn的解释
个人认为,结构不用导出,没有必要

#7


结构体导出的情况倒是有一种,结构体中也可以声明函数,而这些函数体必须有一个实体,此时导出结构体是有必要的

#8


qrlvls(空 气)
是啊!
我这个结构体中是有函数的,因为结构体的默认是公有的撒!
所以成员变量也导出了,所以那个对象成员变量就出了问题.但我认为只要客户代码有那个类型定义的头文件就不会出问题的,所以这个警告我没有去管它,不知道会不会出问题呢?

#9


理论上应该不会有问题,因为在编译时,结构体的成员函数对成员变量的操作是通过定义时的偏移进行的,因此在编译后只要结构体的定义前后一致就没有问题
不过为了安全起见,你可以稍加测试