编译时返回唯一字符串的宏

3

有没有一种可以在编译时返回唯一字符串的宏,以便将其用作Objective-C类的名称?

我想到了这样一个东西:

#define my_macro(params) \
@implementation my_macro_function_giving_unique_string_(MyTrickyRuntimeExtension) \
  //Do stuff \
@end \

1
如果宏生成了一个“神奇”的名称,你如何知道它生成了什么,以便在其他地方引用它?大多数定义的东西需要被引用才能使用。 - unwind
请解释您实际想要实现的内容。 - Pubby
@unwind 我不想引用它,我想触发 +Initialize 方法,这是 Obj-C 运行时在启动时必须运行的方法。从那里,初始化方法将完成一些魔术。 - Jasper Blues
@JasperBlues 我仍然不确定你需要什么。为什么你需要一个唯一标识符呢? - Pubby
您已经使用至少三种不同的编程语言(C、C++、Objective-C)标记了这个问题。您需要用哪种语言编写最终的代码? - Agentlien
2个回答

1
在C++中,它可以是:
#define UNIQUE_NAME2(LINE) Class##LINE
#define UNIQUE_NAME1(LINE) UNIQUE_NAME2(LINE)
#define UNIQUE_NAME UNIQUE_NAME1(__LINE__)

只需将其用作:

class UNIQUE_NAME {};

[注意:每行声明一个类,不要期望在任何地方进行前向声明。]

我考虑了一下。1)您不能添加构造函数或析构函数。2)除非使用“class UNIQUE_NAME {} var;”,否则无法创建此类的变量。也许可以使用“__COUNTER__”... - borisbn
@iammilind 谢谢!你能稍微解释一下它是如何工作的吗?我不太擅长C++。 - Jasper Blues
@iammilind 或许可以添加__FILE__宏来避免在不同文件中定义相同行数的类名相似的问题。 - borisbn
@iammilind,我不认为 FILE 宏适用于类名,对吗? - Jasper Blues
1
@borisbn,不行,因为它将包含“/”或“\”作为完全限定名称。 OP没有提到需要构造函数或析构函数的要求。如果需要,则这种方法将无法使用。 - iammilind
是的...这是我的错。大家不要看我的上一个评论)) - borisbn

1

在Visual Studio中预定义了一个宏__COUNTER__,可以帮助解决这个问题。

我使用了iammilind的建议。

#define UNIQUE2(param) YourClassBaseNames##param
#define UNIQUE1(param) UNIQUE2(param)
#define UNIQUE UNIQUE1(__COUNTER__)

class UNIQUE
{

};

class UNIQUE
{

};

计数器 - 每次返回新的计数

参考:http://msdn.microsoft.com/en-us/library/b0084kay(v=vs.80).aspx

在GCC中也可用


1
##不是那样工作的。您必须通过其他宏来完成,或者使用Boost.PP: BOOST_PP_CAT(base, COUNTER)。 - Pubby
@fen 谢谢。. . 你知道它在clang上是否可用吗? - Jasper Blues
@fen - 哦哦。那真的可以。不错。我会再等30分钟才接受。 - Jasper Blues
“__COUNTER__”不是一个扩展吗?我记得它至少不是c++03标准的一部分。 - iammilind
1
似乎在标准的苹果设备上使用clang无法正常工作。 - Jasper Blues

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接