6

以下がコンパイルされない理由を理解するのに長い時間を費やしました:

enum IPC_RC {OK, EOF, ERROR, NEW };

エラーメッセージは、開き括弧が表示されることを期待していなかったという趣旨のことだけを述べていました。私が学んだのは、より現代的なコンパイラでコンパイルしようとするまではありませんでした:

/usr/include/stdio.h:201:13: note: expanded from macro 'EOF'
#define EOF     (-1)

というわけで、ついにマクロにやられちゃいました!:)

私のコードには含まれていません#include <stdio.h>(.h 接尾辞が付いたものは何も含めていません) が、明らかに、私が含めたものが .h を含める結果になりました<stdio.h>。含まれている場所を正確に追跡せずに、自分自身を保護する方法 (名前空間?) はありますか?

4

2 に答える 2

3

マクロは名前空間を無視するため、名前空間は解決策にはなりません。

したがって、次の 2 つのオプションがあります。

  • これらのマクロを自分で取り除きます:

    #ifdef EOF
    #undef EOF
    #endif
    
  • 列挙値でプレフィックスを使用します。

    enum IPC_RC
    {
        IPC_OK,
        IPC_EOF,
        IPC_ERROR,
        IPC_NEW
    };
    
于 2013-09-19T12:55:34.513 に答える