【问题标题】:Macro to return a unique string at compile-time在编译时返回唯一字符串的宏
【发布时间】:2013-01-18 11:21:36
【问题描述】:

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

我在想这样的事情:

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

【问题讨论】:

  • 如果宏生成了一个“神奇”的名称,您怎么知道它生成了什么,以便在其他地方引用它?您定义的大多数东西都需要被引用才能使用。
  • 解释你实际上想要达到的目标。
  • @unwind 我不想引用它,我想触发 Obj-C 运行时需要在启动时运行一次的 +Initialize 方法。从那里初始化方法将发挥一些作用。
  • @JasperBlues 我仍然不确定您到底想要什么。为什么需要一个唯一标识符?
  • 您已经用至少三种不同的语言(C、C++、Objective-C)标记了这个问题。您需要生成的代码是什么语言的?

标签: c++ objective-c c objective-c-runtime


【解决方案1】:

在 Visual Studio 中有一个预定义的宏 __COUNTER__ 可以提供帮助

我使用了 iammilind 建议

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

class UNIQUE
{

};

class UNIQUE
{

};

counter - 返回新的计数 ech 时间

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

在 GCC 中也可以使用

【讨论】:

  • ## 不能那样工作。您必须通过其他宏来完成,或者使用 Boost.PP:BOOST_PP_CAT(base, __COUNTER__)
  • @fen 谢谢。 . .它在 clang 上可用,你知道吗?
  • @fen - 哦哦。这实际上可以工作。好的。 . .我会再等 30 分钟再接受。
  • __COUNTER__ 不是扩展名吗?我记得至少它不是 c++03 标准的一部分。
  • 似乎它不适用于带有 clang 的标准 Apple 设备。
【解决方案2】:

在 C++ 中,可以是:

#define UNIQUE_NAME2(LINE) Class##LINE
#define UNIQUE_NAME1(LINE) UNIQUE_NAME2(LINE)
#define UNIQUE_NAME UNIQUE_NAME1(__LINE__)

只需将其用作:

class UNIQUE_NAME {};

[注意:每行声明 1 个类,不要希望在任何地方前向声明它:)]

【讨论】:

  • 我想过。 1)您不能添加更近的 c-tor 或 d-tor。 2) 除非class UNIQUE_NAME {} var;,否则不能创建此类的变量。也许使用__COUNTER__ ...
  • @iammilind 谢谢!你能解释一下它是如何工作的吗? .我不太擅长 C++。
  • @iammilind 也许添加__FILE__ 宏以避免类似的类名,在不同的文件中定义但在相同的行
  • @iammilind 我认为____FILE____ 宏不适用于类名,对吗?
  • @borisbn, No FILE 不起作用,因为它将包含 / 或 `` 用于完全限定名称。 OP没有提到构造函数或析构函数的要求。如果需要,那么这将不起作用。
猜你喜欢
  • 2014-11-30
  • 2013-06-07
  • 2018-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
  • 2017-06-14
相关资源
最近更新 更多