尝试将数据成员定义为 dllimport 函数时出现编译器 C2491 错误

本文可帮助你解决尝试将数据成员定义为 dllimport 函数时出现的编译器 C2491 错误。

原始产品版本: Visual C++
原始 KB 数: 815647

症状

不能应用 __declspec(dllimport) 关键字来实现函数。 例如,尝试将数据成员(包括静态数据成员和函数)定义为 dllimport 函数时,会收到以下编译器 C2491 错误消息:

“identifier”:不允许使用 dllimport 函数的定义

原因和解决方法

只能将 __declspec(dllimport) 关键字应用于声明。 不能应用 __declspec(dllimport) 关键字来实现函数。 此关键字的目的是通过 DLL 声明函数的实现。 同样,如果将关键字应用于 __declspec(dllimport) 数据成员,则会收到来自 DLL 的初始数据。 因此,最初无法在代码中分配值。

尝试编译以下代码时,会收到编译器 C2491 错误:

// function definition
void __declspec(dllimport) funcB() 
{
    // error C2491: 'funcB' : definition of dllimport function not allowed
}

发生此行为的原因是将函数实现 dllimport定义为 . 若要避免此编译器错误,请不要定义函数,而是按如下所示声明函数:

// function declaration
void __declspec(dllimport) funcB(); // ok
int main()
{
}

同样,尝试编译以下代码时,会收到编译器 C2491 错误:

//defining data member
extern __declspec(dllimport) int code = 1;
// error C2491: 'code' : definition of dllimport data not allowed

之所以收到此错误消息,是因为已将数据成员 dllimport定义为 . 若要避免此编译器错误,请不要定义数据成员,而是按如下所示声明数据成员:

// declaring data member
extern __declspec(dllimport) int code; // ok