Visual Studio 2008 Express を使用して、Linux ではコンパイルできるが Windows ではコンパイルできないコードが自動的に生成されます。私が抱えている問題は、コンパイラ エラーを理解していないことです。正確なコードを投稿できるとは思わないので、サニタイズしたバージョンを以下に示します...
static const DELETE を宣言する行でエラーが報告されます。注:このファイルをコンパイルすると、コンパイラ エラーは表示されません。ライブラリに正常にビルドされますが、ヘッダーを含む 2 番目のプロジェクトに (間接的に) 表示されます。ソリューションに間接的に含まれている他のプロジェクトが少なくとも 1 つまたは 2 つあると思います。コンパイルに問題はありません。
File_A.h:
enum LONG_TYPE_NAME {
ENUM_NAME_PREFIX_ADD = 0,
ENUM_NAME_PREFIX_CHANGE = 1,
ENUM_NAME_PREFIX_DELETE = 2,
ENUM_NAME_PREFIX_SOMETHINGELSE = 3,
};
//Lots of code here
class FOO : public ::LIBRARY_NAME {
public:
//Some stuff
private:
//Some stuff
public:
//Some more stuff
typedef LONG_TYPE_NAME SHORT_NAME;
static const SHORT_NAME ADD = ENUM_NAME_PREFIX_ADD;
static const SHORT_NAME CHANGE = ENUM_NAME_PREFIX_CHANGE;
/* compiler error for the following line only*/
static const SHORT_NAME DELETE = ENUM_NAME_PREFIX_DELETE;
static const SHORT_NAME SOMETHINGELSE = ENUM_NAME_PREFIX_SOMETHINGELSE;
//More stuff
};
定数自体は 1 か所にしか表示されません (プロジェクトで DELETE という用語を検索すると)。
File_A.cc:
#ifndef _MSC_VER
const LONG_TYPE_NAME FOO::ADD;
const LONG_TYPE_NAME FOO::CHANGE;
const LONG_TYPE_NAME FOO::DELETE;
//More stuff
#endif // _MSC_VER
報告されたエラーは(関連していないと思われるとがerror C2059: syntax error : 'constant'
続きます) ですが、上記のファイルがコンパイルされているときはそうではありません。error C2258: illegal pure syntax, must be '= 0'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
ファイルは、別のプロジェクト (C++) によって静的にリンクされているライブラリにコンパイルされます。これは、エラーを生成しているものです (同様のことを行う 2 番目の .cpp ファイルでも同様です)。すべてのコードをコメントアウトしてもまだ表示されるので、ヘッダーのインクルードと関係があると思います。
エラーを生成する行をコメント アウトすると、Windows でビルドが機能します (Linux では失敗しますが、ifndef の対応する行をコメント アウトすると修正されるはずです)。ただし、その特定の行でコンパイラが失敗する理由を知りたいです。そして、エラーが実際に何を意味するのか。また、自動生成されたコードは変更しない方がよいでしょう。
編集:用語を個々の行に分割すると、コンパイラは DELETE 行を指します。どこかに DELETE という名前で自動的に定義されたマクロがあるのではないでしょうか?
編集 2:いくつかの誤解を解消するために、見出しセクションを少しクリーンアップしました。ちなみに、DELETE 変数の名前を変更すると、エラーも解消されます。
編集 3: VS についてもっと学ぶ必要があることは明らかです - /P は、オブジェクト ファイルを生成せずに前処理されたファイルを生成するため、もちろんビルドはコンパイル エラーを生成せずに失敗します。また、DELETE を (0x00010000L) として定義するマクロがどこかにあるようです。