【问题标题】:Get macro value from NSString containing macro name从包含宏名称的 NSString 获取宏值
【发布时间】:2013-04-29 12:49:10
【问题描述】:

我有一个充满#define 宏值的数组。我还有一个带有字典的 plist 文件(字典),每个都与 #define 宏名称相同。我从 plist 文件中获取字典的名称并将它们放在 NSString 中。现在,我需要将字符串(等于宏的名称)转换为实际的宏值。然后我需要将充满值的数组与 .plist 文件中指定的宏的值进行比较,并检查它是否相等。参见代码示例。

我该怎么做?

    #define ACHIEVEMENT1_ID (ISIPAD() ? @"com.company.blablaHD.id" : @"com.company.blabla.id")
    #define ACHIEVEMENT2_ID ....
    ......

    - (void)checkPlistAndKnownIdentifiers:(NSDictionary *)_plistDictionary {

        NSArray *_knownIdentifiers = @[ACHIEVEMENT1_ID, ACHIEVEMENT2_ID, ...];

        NSArray *_plistDictionariesNames = [_plistDictionary allKeys];

        for (int idx = 0; idx < [_knownIdentifiers count]; idx++) {

           if (_knownIdentifiers[idx] == _plistDictionariesNames[idx]){
               // _knownIdentifiers[idx] returns @"com.company.blabla.id", for example
               // but _plistDictionariesNames[idx] returns @"ACHIEVEMENT1_ID", that is the problem
           } else {
               assert(NO);
           }

        }

    }

可能有一些错误,因为我是凭记忆写的,但你应该明白大致的想法。

另外,我不想在这里使用 extern const 字符串,所以这就是我寻求帮助的原因:)

【问题讨论】:

  • 有理由不使用 const 字符串吗?因为这对我来说听起来更合适......
  • 是的,有 - 因为我需要为这些字符串设置不同的 ID,具体取决于它是 iPhone 还是 iPad。我找到了一种不同的方法,而是为两个设备创建了两个 .plist 并将宏值(而不是宏名称)作为字典的名称,所以在比较时,我比较值并且一切正常:)

标签: objective-c nsstring c-preprocessor


【解决方案1】:

如果我理解您的问题;您希望能够在运行时使用宏名称。 这实际上是不可能的,因为预处理器计算宏,并在实际编译之前替换它。 您的宏名称在运行时不再存在

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    相关资源
    最近更新 更多