不必要的重新定义

时间:2013-01-03 14:20:02

标签: c-preprocessor

我想在我的代码中定义日志级别:

#define INFO 1
#define WARNING 2
#define ERROR 4
#define DEBUG 8

但是在其他一些标准的Microsoft libs ERROR中已经定义了,看起来像其他单词也是保留的。如何处理这种情况?

1 个答案:

答案 0 :(得分:0)

不幸的是,微软定义了很多宏,无论你喜欢与否,这些宏都会被注入你的代码中。所以你最好不要重复他们的错误并避免定义宏。

您可以做的最好的事情是定义常量而不是宏,并将它们放在命名空间中以避免名称冲突。例如:

namespace Log
{
  const int Info = 1;
  const int Warning = 2;
  const int Error = 4;
  const int Debug = 8;
}

然后您可以在代码中将它们用作Log::InfoLog::Error等等。

编辑:正如Tinctorius在评论中指出的那样,在这种情况下使用enum可能会更好:

enum LogLevel
{
  Info = 1;
  Warning = 2;
  Error = 4;
  Debug = 8;
}

在这种情况下,您不需要使用enum类型名称作为前缀,只需使用此类型的变量。例如:

LogLevel level = Warning;

这具有提供类型安全性的优点。您还可以重用其他enum的名称。