我正在使用一个在其标头中定义内联函数的共享库。
这是一个简化的测试用例,如链接到库的编译单元所见(对于库所见的版本,只需替换dllimport
为dllexport
)。
class __declspec(dllimport) MyClass {
public:
int myFunc2();
int myFunc1();
};
inline int MyClass::myFunc2(void) {
return myFunc1();
}
inline int MyClass::myFunc1(void) {
return 0;
}
编译它会给出警告:
警告:“int MyClass::myFunc1()”在被 dll 链接引用后重新声明,没有 dllimport 属性[默认启用]
请注意,定义函数的顺序很重要,因为将定义放在定义myFunc1
之前myFunc2
不会产生警告。
另请注意,此代码在 Visual C++ 下编译时不会出现警告。这些警告至少是针对 MinGW 的,一般来说可能是针对 GCC 的。编辑:我想到我可能必须验证警告是否未被项目设置的标志之一禁止。
我的问题是:
- 为什么会有这种行为?
- 在类声明
myFunc1
中声明可以inline
解决问题。这是为什么 ?这也违反了推荐的做事方式。 - 还有另一种(更好的?)方法来解决这个问题吗?