2012-01-08 1 views
3

私はいくつかのレガシーCコードを作成しています。彼らは正しく見えないし、いくつかのコンパイラの警告(警告:コンマ式の左側のオペランドは効果がありません)、最終的にこれらのマクロを追跡するのに数時間かかりました。これらの奇妙なマクロ定義は何を意味していますか?それとも正しいですか?

誰でも正しいのかどうか教えてもらえますか(そうでないと思います)、そうでない場合はどうすれば修正できますか?

これは本当に何
#define MAX_MEMORY_BLOCK (sizeof(size_t)==2,65535,2147483647) 
#define MAX_ARRAY_SIZE (sizeof(size_t)==2,16384,1073741824) 
+0

コードではどのような文脈で使用されていますか? –

+0

@CodyGray私はそうは思わない - それらはカンマの明確な値です。私には意味がありません。 –

+2

オリジナルの意図は '(sizeof(size_t)== 2?a:b)'でしょうか? – Mat

答えて

5

カンマ演算子を含みます。唯一の最後の値が「カウント」ので、彼らは同等である:

#define MAX_MEMORY_BLOCK (2147483647) 
#define MAX_ARRAY_SIZE (1073741824) 

また、誰かが三項演算子は?:を使用していることを忘れてしまった:

#define MAX_MEMORY_BLOCK (sizeof(size_t)==2 ? 65535 : 2147483647) 
#define MAX_ARRAY_SIZE (sizeof(size_t)==2 ? 16384 : 1073741824) 

しかし、sizeof(size_t) == 2(いくつかの近代的なシステムががありますおそらく、特に組み込みコンピューティングの世界では、いくつか存在するでしょう)。

+0

ええ、三元演算子のことは実際に意味をなさない。問題を引き起こしていない限り、おそらく問題ではありません。 –

+0

ジョナサン:なぜあなたはそのような高い評判スコアを持っているのですか。私は決して三分の二演算子がないと思ったことはありません。マクロは最終的に今や意味をなさない。私はそれに応じてコードを修正しました。ありがとう! –

2

は、次のとおりです。最近のコンパイラで

1, 65535, 2147483647 
1, 16384, 1073741824 

または

0, 65535, 2147483647 
0, 16384, 1073741824 

最初の2つの表現は何もしないので、不平を言っています。通常、コンマで区切った場合は、同時に何かを起こさせたいからです。 (実際、私は彼らがすべてであまり使用され表示されません。)

あなたは警告を取り除くしたい場合は、おそらくなるためにそれらを変更することができます:

#define MAX_MEMORY_BLOCK 2147483647 
#define MAX_ARRAY_SIZE 1073741824 

私はありませんこれらの値が実際には意味をなさないかどうかは確かです。