我正在用 C / Objective-C 开发一个应用程序(请不要使用 C++,我已经有一个解决方案),我遇到了一个有趣的用例。
因为clang不支持嵌套函数,所以我原来的做法是行不通的:
#define CREATE_STATIC_VAR(Type, Name, Dflt) static Type Name; __attribute__((constructor)) void static_ ## Type ## _ ## Name ## _init_var(void) { /* loading code here */ }
这段代码可以用 GCC 很好地编译,但是因为 clang 不支持嵌套函数,我得到一个编译错误:
预期的 ';' 在声明结束时。
所以,我找到了一个适用于函数内部变量的 Clang 解决方案:
#define CREATE_STATIC_VAR_LOCAL(Type, Name, Dflt) static Type Name; ^{ /* loading code here */ }(); // anonymous block usage
但是,我想知道是否有一种方法可以利用宏连接来选择适合这种情况的连接,例如:
#define CREATE_STATIC_VAR_GLOBAL(Type, Name, Dflt) static Type Name; __attribute__((constructor)) void static_ ## Type ## _ ## Name ## _init_var(void) { /* loading code here */ }
#define CREATE_STATIC_VAR_LOCAL(Type, Name, Dflt) static Type Name; ^{ /* loading code here */ }(); // anonymous block usage
#define SCOPE_CHOOSER LOCAL || GLOBAL
#define CREATE_STATIC_VAR(Type, Name, DFLT) CREATE_STATIC_VAR_ ## SCOPE_CHOOSER(Type, Name, Dflt)
显然,最终的实现不必完全如此,但类似的东西就足够了。
我曾尝试使用__builtin_constant_p
with __func__
,但因为__func__
它不是编译时常量,所以它不起作用。
我也尝试过使用__builtin_choose_expr
,但这似乎不适用于全局范围。
我在文档中还缺少什么吗?似乎这应该是相当容易做到的事情,但是,我似乎无法弄清楚。
注意:我知道我可以简单地键入CREATE_STATIC_VAR_GLOBAL
或CREATE_STATIC_VAR_LOCAL
代替宏连接,但这是我试图突破编译器的限制。我也知道我可以使用 C++ 并立即解决这个问题,但这不是我的目标。