#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在这里可能会被编译器忽略
这里的 struct 加上 dllexport 应该是没有意义的,因为没有导出任何实体,dllexport在这里可能会被编译器忽略
#2
如果我在这个头文件中没有#include <comutil.h>,那就不是warning了,我肯定包含了撒!
这个struct肯定是有意义的,我都说了,其它与问题无关的地方我都已经省略了,就是这个公有的成员变量,因为在类的定义上加了__declspec(dllexport)了之后才有这个警告的。
还有:为什么定义一个_bstr_t* 就不会有警告,而定义一个变量就有呢?
这个struct肯定是有意义的,我都说了,其它与问题无关的地方我都已经省略了,就是这个公有的成员变量,因为在类的定义上加了__declspec(dllexport)了之后才有这个警告的。
还有:为什么定义一个_bstr_t* 就不会有警告,而定义一个变量就有呢?
#3
个人认为:
指针是标准类型,不管是什么类型的指针长度都是相同的,编译器能够获知其入栈、出栈的方式
而导出时并未为_bstr_t生成任何符号链接,因此在导出时产生此警告意在提醒开发人员
不过使用时,只要用户使用相同的结构定义仍然是可以正常使用的
-----------------------------
根据上面的分析,需要修正未导出任何实体的说法,这种情况下是会导出layerAttSel符号链接的
不过我也不确认这样的分析是否正确,希望后面的兄弟能够斧正
指针是标准类型,不管是什么类型的指针长度都是相同的,编译器能够获知其入栈、出栈的方式
而导出时并未为_bstr_t生成任何符号链接,因此在导出时产生此警告意在提醒开发人员
不过使用时,只要用户使用相同的结构定义仍然是可以正常使用的
-----------------------------
根据上面的分析,需要修正未导出任何实体的说法,这种情况下是会导出layerAttSel符号链接的
不过我也不确认这样的分析是否正确,希望后面的兄弟能够斧正
#4
结构体有必要导出吗?直接就可以用吧。
#5
gohappy_1999(碧水蓝天)都说了很多遍了,结构中的其他部分已经省略了,怎么老是看贴不注意呢?
qrlvls( 空 气 )说得关于指针的问题,似乎有些道理,不过我还是不怎么懂呀!
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的解释
个人认为,结构不用导出,没有必要
这是msdn的解释
个人认为,结构不用导出,没有必要
#7
结构体导出的情况倒是有一种,结构体中也可以声明函数,而这些函数体必须有一个实体,此时导出结构体是有必要的
#8
qrlvls(空 气)
是啊!
我这个结构体中是有函数的,因为结构体的默认是公有的撒!
所以成员变量也导出了,所以那个对象成员变量就出了问题.但我认为只要客户代码有那个类型定义的头文件就不会出问题的,所以这个警告我没有去管它,不知道会不会出问题呢?
是啊!
我这个结构体中是有函数的,因为结构体的默认是公有的撒!
所以成员变量也导出了,所以那个对象成员变量就出了问题.但我认为只要客户代码有那个类型定义的头文件就不会出问题的,所以这个警告我没有去管它,不知道会不会出问题呢?
#9
理论上应该不会有问题,因为在编译时,结构体的成员函数对成员变量的操作是通过定义时的偏移进行的,因此在编译后只要结构体的定义前后一致就没有问题
不过为了安全起见,你可以稍加测试
不过为了安全起见,你可以稍加测试
#1
出现warning不是由于 __declspec(dllexport) 引起的,你需要 #include <comutil.h>,在comutil.h中才定义了 _bstr_t
这里的 struct 加上 dllexport 应该是没有意义的,因为没有导出任何实体,dllexport在这里可能会被编译器忽略
这里的 struct 加上 dllexport 应该是没有意义的,因为没有导出任何实体,dllexport在这里可能会被编译器忽略
#2
如果我在这个头文件中没有#include <comutil.h>,那就不是warning了,我肯定包含了撒!
这个struct肯定是有意义的,我都说了,其它与问题无关的地方我都已经省略了,就是这个公有的成员变量,因为在类的定义上加了__declspec(dllexport)了之后才有这个警告的。
还有:为什么定义一个_bstr_t* 就不会有警告,而定义一个变量就有呢?
这个struct肯定是有意义的,我都说了,其它与问题无关的地方我都已经省略了,就是这个公有的成员变量,因为在类的定义上加了__declspec(dllexport)了之后才有这个警告的。
还有:为什么定义一个_bstr_t* 就不会有警告,而定义一个变量就有呢?
#3
个人认为:
指针是标准类型,不管是什么类型的指针长度都是相同的,编译器能够获知其入栈、出栈的方式
而导出时并未为_bstr_t生成任何符号链接,因此在导出时产生此警告意在提醒开发人员
不过使用时,只要用户使用相同的结构定义仍然是可以正常使用的
-----------------------------
根据上面的分析,需要修正未导出任何实体的说法,这种情况下是会导出layerAttSel符号链接的
不过我也不确认这样的分析是否正确,希望后面的兄弟能够斧正
指针是标准类型,不管是什么类型的指针长度都是相同的,编译器能够获知其入栈、出栈的方式
而导出时并未为_bstr_t生成任何符号链接,因此在导出时产生此警告意在提醒开发人员
不过使用时,只要用户使用相同的结构定义仍然是可以正常使用的
-----------------------------
根据上面的分析,需要修正未导出任何实体的说法,这种情况下是会导出layerAttSel符号链接的
不过我也不确认这样的分析是否正确,希望后面的兄弟能够斧正
#4
结构体有必要导出吗?直接就可以用吧。
#5
gohappy_1999(碧水蓝天)都说了很多遍了,结构中的其他部分已经省略了,怎么老是看贴不注意呢?
qrlvls( 空 气 )说得关于指针的问题,似乎有些道理,不过我还是不怎么懂呀!
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的解释
个人认为,结构不用导出,没有必要
这是msdn的解释
个人认为,结构不用导出,没有必要
#7
结构体导出的情况倒是有一种,结构体中也可以声明函数,而这些函数体必须有一个实体,此时导出结构体是有必要的
#8
qrlvls(空 气)
是啊!
我这个结构体中是有函数的,因为结构体的默认是公有的撒!
所以成员变量也导出了,所以那个对象成员变量就出了问题.但我认为只要客户代码有那个类型定义的头文件就不会出问题的,所以这个警告我没有去管它,不知道会不会出问题呢?
是啊!
我这个结构体中是有函数的,因为结构体的默认是公有的撒!
所以成员变量也导出了,所以那个对象成员变量就出了问题.但我认为只要客户代码有那个类型定义的头文件就不会出问题的,所以这个警告我没有去管它,不知道会不会出问题呢?
#9
理论上应该不会有问题,因为在编译时,结构体的成员函数对成员变量的操作是通过定义时的偏移进行的,因此在编译后只要结构体的定义前后一致就没有问题
不过为了安全起见,你可以稍加测试
不过为了安全起见,你可以稍加测试