在预编译头中定义const - 如何避免重复

时间:2013-05-15 05:00:53

标签: objective-c c-preprocessor const

我想使用CocoaLumberjack并尝试在我的.pch文件中插入ddLogLevel const

#if DEBUG
static const int ddLogLevel = LOG_LEVEL_VERBOSE;
#else
static const int ddLogLevel = LOG_LEVEL_INFO;
#endif

但是,由于我正在使用XMPP框架,并且使用CocoaLumberjack,因此我收到Redefinition of 'ddLogLevel'错误,因为这些类包含与上面完全相同的const定义。

我绝对不想在每个类中定义ddLogLevel来避免这种情况。我怎么能绕过这个?

3 个答案:

答案 0 :(得分:2)

你可以在它附近加一个守卫。像这样:

#ifndef ddLogLevel
#if DEBUG
static const int ddLogLevel = LOG_LEVEL_VERBOSE;
#else
static const int ddLogLevel = LOG_LEVEL_INFO;
#endif //DEBUG
#endif //ddLogLevel

如果您不能使用ddLogLevel作为警卫:(目前无法测试)

#ifndef DDLOGLEVEL
#if DEBUG
#define DDLOGLEVEL
static const int ddLogLevel = LOG_LEVEL_VERBOSE;
#else
static const int ddLogLevel = LOG_LEVEL_INFO;
#endif //DEBUG
#endif //DDLOGLEVEL

我希望它有效。

答案 1 :(得分:1)

我认为答案是不要将ddLogLevel声明为静态(如本指南https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/XcodeTricks中所述)

相反,请遵循此Global log level for cocoalumberjack

这类似于MagicalRecord遇到的Magical Record takes ownership of ddLogLevel

Constant.h

extern int const ddLogLevel;

Constant.m

#import <CocoaLumberjack/DDLog.h>
#ifdef DEBUG
    int const ddLogLevel = LOG_LEVEL_VERBOSE;
#else
    int const ddLogLevel = LOG_LEVEL_WARN;
#endif

另外,有些人似乎不明白标头文件中static个关键字的含义,请阅读此Variable declarations in header files - static or not?

答案 2 :(得分:0)

在预处理程序指令中包装定义:

#ifndef DEFINED_DD_LOG_LEVEL
#define DEFINED_DD_LOG_LEVEL
#  if DEBUG
...
#  endif // DEBUG
#endif // DEFINED_DD_LOG_LEVEL