私はこのようないくつかのCコードで問題に遭遇しました:
struct SomeType { ...details immaterial... };
static struct SomeType array[] =
{
{ ... },
...
{ ... },
};
enum { ARRAY_SIZE = sizeof(array) / sizeof(array[0]) };
Unixコンパイラー(GCCのさまざまなバージョン、およびAIXとHP-UXのコンパイラー)はすべて、に非常に満足していましたenum
。MSVC2005はエラーで異議を唱えましC2056: Illegal Expression
た。MSDNによると、これは「前のエラーのために式が無効だった」ためです。これが報告された唯一のエラーであり、少し驚くべきことです。
ただし、私の質問は次のとおりです。
- MSVC 2005は、C89標準を正確に解釈して許可してい
enum
ませんか? - Unixコンパイラは、警告なしにこれを許可するのに寛大すぎますか?
- C99(またはC2011)は何か違いがありますか?
- MSVCのより新しいバージョンはまだ反対してい
enum
ますか?
FWIW:許容できる解決策は、次のように変更することでしたenum
。
static int const ARRAY_SIZE = sizeof(array) / sizeof(array[0]);
非推奨のオプションは面倒です
Michael Burrは、非常に価値のあるいくつかの追加情報を提供し、問題のロックを解除することができました。
コンパイル可能な例(実際の問題と同型):
static const char *names[] = { "abc", "def", "ghi" };
enum { NAMES_SIZE = sizeof(names) / sizeof(names[0]) };
static const struct stuff { const char *name; int flags; } array[] =
{
{ "abc", 1 },
{ "def", 2 },
{ "ghi", 3 },
};
enum { ARRAY_SIZE = sizeof(array) / sizeof(array[0]) };
MSVCの正確なバージョン(によって与えられるcl
)は次のとおりです。
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86
それはマイケルがうまくいくと言っているバージョンです。
そして、私は自分の問題の原因を見つけました。(以下のコマンドラインは、プロジェクト固有のガフ(サンプルコードに必要のない多数の/Dおよび/Iオプション)をすべて削除します。)コンパイル:
cl /W3 /c /LD /MD /Od aaa.c
そして、上記のコードは正常にコンパイルされます。
cl /Zg /W3 /c /LD /MD /Od aaa.c
これにより、最初に警告が生成されます。
cl : Command line warning D9035 : option 'Zg' has been deprecated and will be removed in a future release
私は1年以上、非推奨のオプションを使用してコンパイルが行われることについて愚痴をこぼしてきましたが、このサブプロジェクトを担当するチームの誰も立ち上がって修正することをいとわなかったので、私はそうするべきではありません—変更されようとしている何か。
そしてそれは言う:
aaa.c(2) : error C2056: illegal expression
aaa.c(10) : error C2056: illegal expression
そのため、この/Zg
オプションは非推奨になるだけでなく、そもそも問題の原因にもなります。今、私は人々を追いかけるためのより良い弾薬を持っています!
マイケル、追加情報をありがとう。
PS:MSDNページに/Zg
は次のように書かれています。
このオプションを使用し、プログラムに、、、またはタイプ(またはそのようなタイプへのポインター)
/Zg
を持つ仮パラメーターが含まれているstruct
場合、各、、、またはタイプの宣言にはタグ(名前)が必要です。enum
union
struct
enum
union
それは完全に正確ではありません。サンプルフラグメントには正式なパラメータはなく、enum
値が関数に渡されることはありませんでした。ただし、にタグがない場合でも、フラグenum
とともにエラーが表示されます。/Zg
(いいえ。私はMSVC 2005に特に執着していません。私が働いているグループは、まだ最近のものにアップグレードされていません。ほとんどの場合、影響はありません。このように、非常に痛い場合があります。ある日、Windows上の他のビルドが受け入れているように見える理由を解明しenum
ます。この特定のサブ製品が他のすべてのものと一致せず、他の製品が使用するよりも古いコンパイラを使用していることに気付くのではないかと心配しています。 )。
これは厳密にはCコードです。MSVCタグは、Visual-C++タグの同義語です。