宏扩展参数作为字符串

时间:2014-08-19 10:49:46

标签: objective-c macros c-preprocessor

我希望简化"胶水"我的应用中的代码。

我的目标是:

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. 为每个变量都有一个属性,并用编码器方法编写相应的编码(真正的痛苦)

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

  3. 我选择了解决方案#2。但我仍然希望拥有访问器。所以,我可以通过在字典中获取正确的值来设计一个为我编写访问器的宏。

    所有这一点之间的共同点是访问者和字典的密钥都具有相同的名称。

1 个答案:

答案 0 :(得分:0)

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

Constants.h:

Constants.h

Constants.m:

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

减少打字的一种方法是:

Constants.h:

#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";

Constants.m:

#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);

然后,您只需使用名称

即可引用这些常量字符串
#import "Constants.h"

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

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