일반 규칙 및 제한 사항
Microsoft 전용
함수를 선언 하거나 하지 않고 개체의 dllimport 또는 dllexport 속성, 함수 또는 개체 DLL 인터페이스의 일부로 간주 되지.따라서 함수 또는 개체의 정의에서 해당 모듈 또는 동일한 프로그램의 다른 모듈에 있어야 합니다.DLL 인터페이스 함수 또는 개체 부분에 함수 또는 다른 모듈 이름으로 개체의에서 정의를 선언 해야 합니다 dllexport.그렇지 않으면 링커 오류가 생성 됩니다.
함수 선언 또는 개체 사용 하는 경우는 dllexport 특성을 정의 같은 프로그램의 일부 모듈에서 나타나야 합니다.그렇지 않으면 링커 오류가 생성 됩니다.
단일 모듈 프로그램에 모두 포함 되어 있는 경우 dllimport 및 dllexport 는 함수 또는 개체에 대 한 선언을 dllexport 특성 작업 우선 dllimport 특성입니다.그러나, 컴파일러가 경고를 발생 합니다.예를 들면 다음과 같습니다.
__declspec( dllimport ) int i; __declspec( dllexport ) int i; // Warning; inconsistent; // dllexport takes precedence.
C + +에서는 전역으로 선언 된 또는 정적 로컬 데이터 포인터를 초기화할 수 있습니다 또는 선언 된 데이터 개체의 주소는 dllimport C에서 오류가 발생 하는 특성뿐만 아니라, 선언 된 함수의 주소를 가진 로컬 정적 함수 포인터를 초기화할 수 있습니다 해당 dllimport 특성입니다.C에서 그러한 할당 함수의 주소 대신 DLL 가져오기 썽크에 대 (함수에 제어를 전달 하는 코드 스텁)의 주소에 대 한 포인터를 설정 합니다.C + +의 포인터는 함수의 주소를 설정합니다.예를 들면 다음과 같습니다.
__declspec( dllimport ) void func1( void ); __declspec( dllimport ) int i; int *pi = &i; // Error in C static void ( *pf )( void ) = &func1; // Address of thunk in C, // function in C++ void func2() { static int *pi = &i; // Error in C static void ( *pf )( void ) = &func1; // Address of thunk in C, // function in C++ }
그러나 프로그램에 포함 되어 있기 때문에 dllexport 특성 개체의 선언에서 프로그램의 해당 개체에 대 한 정의 제공 해야, 전역 또는 로컬 정적 함수 포인터의 주소를 초기화할 수는 dllexport 함수.마찬가지로 전역 또는 로컬 정적 데이터 포인터의 주소를 초기화할 수는 dllexport 데이터 개체입니다.예를 들어, 다음 코드는 C 또는 C++에서는 오류를 생성 하지 않습니다.
__declspec( dllexport ) void func1( void ); __declspec( dllexport ) int i; int *pi = &i; // Okay static void ( *pf )( void ) = &func1; // Okay void func2() { static int *pi = &i; // Okay static void ( *pf )( void ) = &func1; // Okay }
동작의 변경 때문에 Visual C++에 도입.NET 응용 프로그램을 만들려면 dllexport 보다 일관 된 일반 클래스와 클래스 템플릿 특수화를 적용 하는 경우 dllexport 로 표시 된 기본 클래스는 일반 클래스에 dllexport, C4275 컴파일러에서 발생 합니다.
클래스 템플릿 특수화는 기본 클래스가 있는 경우 컴파일러는 같은 경고가 발생 합니다.이 문제를 해결 하려면 기본 클래스를 표시 합니다. dllexport.클래스 템플릿 특수화의 문제 위치를 것을 __declspec (dllexport). 클래스 템플릿을 표시할 수 있습니다.대신, 명시적으로 클래스 템플릿을 인스턴스화하고이 명시적 인스턴스화를 표시 dllexport.예를 들면 다음과 같습니다.
template class __declspec(dllexport) B<int>; class __declspec(dllexport) D : public B<int> { // ...
파생 클래스 템플릿 인수가 있는 경우이 해결 방법은 작동 하지 않습니다.예를 들면 다음과 같습니다.
class __declspec(dllexport) D : public B<D> { // ...
이 템플릿 사용 하 여 일반적인 패턴 이므로 컴파일러의 의미를 변경 dllexport 하나 이상의 기본 클래스는 클래스에 적용 되 고 기본 클래스를 클래스 템플릿의 특수화 되 면.이 경우 컴파일러는 암시적으로 적용 dllexport 클래스 템플릿 특수화를 합니다.Visual C++에서.NET에서 사용자가 다음 작업을 수행 하 고 경고 메시지가 없습니다 수 있습니다.
class __declspec(dllexport) D : public B<D> { // ...