[お知らせ] Microsoft の "Developer Network (日本語)" で "プロジェクト名_EXPORTS"定数の未定義について指摘した ところ、日曜日(2017.10.08)の朝だというのに40分未満で適切な内容の返信が投稿され、 Microsfotの開発チームへの報告 が動画付きで上がりました。優秀な技術者、恐るべし。


プロジェクトの名前を入力してから、"OK" を選択します。

[注意] このバグは Oct/11/2017 にリリースされた Visual Studio 2017 version 15.4 で解決されています。
DLL のプロジェクトには "プロジェクト名.h" と "プロジェクト名.cpp" というファイルが含まれています。これらを Example.h と Example.cpp として説明します。
| Example.h |
#ifdef EXAMPLE_EXPORTS
#define EXAMPLE_API __declspec(dllexport)
#else
#define EXAMPLE_API __declspec(dllimport)
#endif
class EXAMPLE_API CExample {
public:
CExample(void);
};
extern EXAMPLE_API int nExample;
EXAMPLE_API int fnExample(void);
|
| Example.cpp (初期状態) |
#include "stdafx.h"
#include "Example.h"
EXAMPLE_API int nExample=0;
EXAMPLE_API int fnExample(void)
{
return 42;
}
CExample::CExample()
{
return;
}
|
[1]の場合は、Visual Studio が EXAMPLE_EXPORTS を定義してコンパイルするので、Example.cpp の EXAMPLE_API は __declspec(dllexport) として扱われます。
[2]の場合は、 EXAMPLE_EXPORTS が定義されない状態でコンパイルするので、 Example.h の中の EXAMPLE_API は __declspec(dllimport) として扱われます。
すなわち、[1], [2] どちらの場合でも同じ Example.h が使えるという便利な状況になっているわけです。
| Example.cpp (バグ対処後) |
#include "stdafx.h"
#ifndef EXAMPLE_EXPORTS
#define EXAMPLE_EXPORTS
#endif
#include "Example.h"
EXAMPLE_API int nExample=0;
EXAMPLE_API int fnExample(void)
{
return 42;
}
CExample::CExample()
{
return;
}
|