【问题标题】:Macro expanding parameters as strings宏扩展参数作为字符串
【发布时间】:2014-08-19 10:49:45
【问题描述】:

我希望在我的应用中简化“胶水”代码的编写。

我的目标是这样的:

MAKE_KEY(keyname)

展开为

#define keyname @"keyname"

不幸的是,我很确定我不能在#define 中使用#define。

所以,我的目标是扩展:

MAKE_KEY(keyname)

作为

keyname @"keyname"

这样我就可以写了:

#define MAKE_KEY(USER_ID)

得到

#define USER_ID @"USER_ID"

我该怎么做?

显示您希望如何使用扩展值来帮助解决您的问题

我想生成#define MY_CONST @"MY_CONST",而不需要输入两次 MY_CONST(因为我有很多要处理的...) 然后,我将在代码中任何需要的地方使用MY_CONST

我这样做是因为我将拥有像 peoplecitiesplantsanimals 等对象......它们不会有很多方法,而是有很多变量。这些对象需要可序列化。

有两种方法可以做到这一点:

  1. 每个变量都有一个属性,用coder方法写对应的encode(真的很痛苦)

  2. 将所有数据输入到字典中,然后在encodewithcoder中序列化字典。

我选择了解决方案 #2。但我仍然想拥有访问器。因此,我可以设计一个宏来为我编写访问器,方法是在字典中获取正确的值。

所有的共同点是访问器和字典的键都共享相同的名称。

【问题讨论】:

  • 您仍在从#define 生成#define。展示您希望如何使用扩展值来帮助解决您的问题。
  • @trojanfoe 感谢您的回复。我已经相应地更新了我的问题。

标签: objective-c macros c-preprocessor


【解决方案1】:

对于整个应用程序中使用的常量,通常认为最好将字符串(或其他对象)的所有定义放在单个实现文件(例如Constants.m)中并有一个头文件声明这些实例为extern(例如Constants.h):

常量.h:

extern NSString * const CONST_STRING_1;
extern NSString * const CONST_STRING_2;
extern NSString * const CONST_STRING_N;

常量.m:

#import "Constants.h"

NSString * const CONST_STRING_1 = @"CONST_STRING_1";
NSString * const CONST_STRING_2 = @"CONST_STRING_2";
NSString * const CONST_STRING_N = @"CONST_STRING_N";

减少打字的一种方法是:

常量.h:

#define EXCONST(name) extern NSString * const name
#define CONST(name) NSString * const name = @#name

EXCONST(CONST_STRING_1);
EXCONST(CONST_STRING_2);
EXCONST(CONST_STRING_N);

常量.m:

#import "Constants.h"

CONST(CONST_STRING_1);
CONST(CONST_STRING_2);
CONST(CONST_STRING_N);

然后您就可以仅使用名称来引用这些常量字符串:

dict[CONST_STRING_1] = @"Hello";

注意:这是未经测试的,因此可能会出错。

【讨论】:

    猜你喜欢
    • 2012-01-25
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 2017-02-02
    相关资源
    最近更新 更多