【问题标题】:Accessing the value of a Preprocessor Macro definition访问预处理器宏定义的值
【发布时间】:2011-03-16 18:16:39
【问题描述】:

如果我在 GCC_PREPROCESSOR_DEFINITIONS 下添加宏“FOO=bar”(如果使用 XCode,则添加预处理器宏),访问“FOO”值的最佳方法是什么?

目前,我使用的是笨拙的:

    #define MACRO_NAME(f) #f
    #define MACRO_VALUE(f)  MACRO_NAME(f)

    #ifdef FOO
        NSLog(@"%s", MACRO_VALUE(FOO));
    #else
        NSLog(@"undefined");
    #endif

这将输出“bar”

当然,一定有更好/更清洁的方法吗?

【问题讨论】:

    标签: objective-c xcode macros c-preprocessor stringification


    【解决方案1】:

    你正在做的是方式stringize(或stringify)宏值。间接是不可避免的。

    这在 Rob 链接到的 GCC 预处理器 manual section (archived link) 中提到:

     #define xstr(s) str(s)
     #define str(s) #s
     #define foo 4
     str (foo)
          ==> "foo"
     xstr (foo)
          ==> xstr (4)
          ==> str (4)
          ==> "4
    

    【讨论】:

      【解决方案2】:
      NSLog(@"%s", #FOO);
      

      Stringification。这是您已经在使用的技术。有什么问题?

      【讨论】:

      • 这将在预处理后产生NSLog(@"%s", #bar); - 需要通过另一个宏进行间接处理以允许宏扩展。
      • 这意味着您不能将预处理器字符串宏转换为 NSString 常量,对吧? (因为一旦你执行 [NSString stringWithFormat:macroString] 它就不再是一个常量初始化器了。)
      • 我的一个项目已将预处理器字符串宏转换为 NSString 常量,如下所示:#define kString "String" #define kNSString @kString
      猜你喜欢
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多