【问题标题】:C macro that creates an NSString variable with the variable name as the content of the stringC 宏,创建一个 NSString 变量,变量名作为字符串的内容
【发布时间】:2012-05-14 01:16:34
【问题描述】:

尽管这不是一个好的编码习惯,但我想要一个应该像下面这样工作的宏:

CREATE_STRING(fooBar)

它应该创建以下代码:

NSString *fooBar = @"fooBar";

我的宏是这样的:

#define CREATE_STRING(varName) NSString *varName = @"varName";

但现在我得到以下内容

NSString *fooBar = @"varName";

这似乎是一个很容易解决的问题,我已经检查了文档from IBM,但我似乎无法将varName 放入字符串中。

【问题讨论】:

    标签: ios objective-c c-preprocessor


    【解决方案1】:

    使用

    #define CREATE_STRING(varName) NSString *varName = @#varName
    

    相反。 (另请注意,您不需要尾随分号,以便能够将宏“调用”为类 C 函数。)

    【讨论】:

    • [...]Untitled.m:7:34:错误:使用未声明的标识符“foo”;您指的是 'for' 吗? NSString *mary = CREATE_STRING(foo); ^ Untitled.m:3:42: 注意:扩展自宏 'CREATE_STRING' #define CREATE_STRING(varName) NSString *varName = @#varName ^ 生成 2 个错误。
    • 你叫它CREATE_STRING(foo); (调用时末尾有分号)?如果没有,请尝试这样做。错误不在使用宏的地方。
    • 我刚刚将您的宏定义换成我的以获取该错误,您的无法正常工作。您只能在预处理器中对宏进行字符串化,因此我在回答中使用的方法需要在字符串化之前将裸字符转换为宏。
    • "你只能在预处理器中对宏进行字符串化"
    • +1 我刚刚测试了这个答案,它非常好。在我尝试之前,我认为@#varName 会是一个语法错误。
    【解决方案2】:

    这是怎么做的

    #define CREATE_STRING(varName) NSString *varName = @"" #varName
    

    它利用了两个字符串常量一个接一个地被编译器连接起来的事实。

    【讨论】:

    • 在否决之前,有人真的尝试过我的解决方案吗?
    • 这与@H2CO3 的回答有何不同?
    • 不同之处在于它连接了两个字符串,而不仅仅是在'@'之后插入C字符串化的名称。
    • @H2CO3 他本可以对您的答案发表评论,您可以更正它,不是吗?
    • @trojanfoe @H2CO3 当我发布我的答案时,我不相信直接的@#varName 会起作用,因为在过去它没有。但是,我刚刚使用当前的 clang 编译器进行了尝试,现在可以了。顺便说一句,对 H2CO3 的回答投反对票的不是我。当我投反对票时,我总是发布 cmets。
    猜你喜欢
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多