Con*_*tin 8 dllimport dllexport visual-c++
假设我有这两个文件:
Header.h
class DLL ExportClass{
public:
ExportClass();
static int test;
};
Run Code Online (Sandbox Code Playgroud)
Source.cpp
#ifdef EXPORT
#define DLL __declspec(dllexport)
#else
#define DLL __declspec(dllimport)
#endif
#include "Header.h"
int ExportClass::test = 0;
ExportClass::ExportClass(){
}
Run Code Online (Sandbox Code Playgroud)
我不会定义EXPORT
(导入已导出的类与static
成员),为什么我会收到这些警告:
1>source.cpp(11): warning C4273: 'test' : inconsistent dll linkage
1> header.h(4) : see previous definition of 'public: static int ExportClass::test'
1>source.cpp(13): warning C4273: 'ExportClass::ExportClass' : inconsistent dll linkage
1> header.h(3) : see previous definition of '{ctor}'
Run Code Online (Sandbox Code Playgroud)
而这个错误:
1>source.cpp(11): error C2491: 'ExportClass::test' : definition of dllimport static data member not allowed
Run Code Online (Sandbox Code Playgroud)
如果我定义EXPORT
它的工作原理.我有点理解警告,但我想,编译器可以忽略静态变量和ctor,因为整个类都被声明为__declspec(dllimport)
无论如何.我想使用相同的代码为__declspec(dllexport)
和__declspec(dllimport)
-但似乎编译stll试图定义标记为这些符号__declspec(dllexport)
在他们的声明.解决这个问题的常见做法是什么?
Han*_*ant 20
您期望编译器忽略非常严重的事故.它在类声明中遇到了__declspec(dllimport)属性,它非常明确地声明类实现存在于将在运行时绑定的不同模块中.但是它也遇到了这个定义,完全出乎意料,因为属性契约说它是在一个完全不同的项目中编译的.
生成C4273警告是为了提醒您,在运行时实际要执行的功能是非常不清楚的.有两个,一个忙于编译,另一个在DLL中.实际执行哪一个是一个疯狂的猜测.C4273是1级警告,适合"这几乎肯定是错误的"类别.这是完全不可能的工作没关系,因为有一些预期的功能至少有相同的代码.然而,不会造成麻烦的几率并不大,它只有在函数没有任何改变内部DLL状态的副作用时才能工作.它确实很难诊断错误.
然后它遇到了导出的变量.同样的情况,有两个.这是编译器程序员放下脚本的地方,让代码随机使用一个或另一个不再是可以忽略的东西.那就是无法工作,变量不能具有相同的价值.所以C2491是一个硬错误.
不知道你是怎么进入这个泡菜的,显然你想要旅行的路会让你从陡峭的悬崖上掉下来.
归档时间: |
|
查看次数: |
22013 次 |
最近记录: |