【问题标题】:C: Declare and execute function in one lineC:在一行中声明和执行函数
【发布时间】:2021-01-29 07:19:02
【问题描述】:

我可以在 GCC 中执行以下操作:


#define INIT_MODULE(name) \
    ({ extern int name(void); name(); })


int main(void) {
    return INIT_MODULE(x);
}

在这里,函数(从name 扩展)通过语句表达式(GCC 扩展)创建、执行和返回。这是一个最小的 repo:我实际上正在做一些 __asm__ 魔术来制作 name 函数,因此是宏。

我希望它是单行的,而不是调用另一个宏来创建name 函数。在我的用例中,调用者只会调用一次INIT_MODULE,并且不/不应该知道它正在调用的底层函数的名称。

基本上,我需要一种在一行中声明、运行和返回函数值的方法(不使用 GCC 扩展!)。

我不想要的:

// ...

DECL_MODULE(x);

int main(void) {
    return INIT_MODULE(x);
}

有什么想法吗?

【问题讨论】:

    标签: c gcc clang


    【解决方案1】:

    我认为您想要的不仅仅是简单地声明、运行和返回函数 - 否则您可以按照您已经实现的相同方式立即执行此操作。

    我看到的问题是您希望函数在外部可见,就好像它是在调用者范围之外声明的一样。这显然是不可能的,因为#define 只是替换了宏的内容(它不能将它移动到代码的另一点)。

    实际上,您可以使用低级 goto 和一些算术,但我不建议您使用该路径。

    【讨论】:

    • 使用extern 不会使函数在外部可见(事实上,extern 是函数的默认值,所以我不需要包含它)。 extern 仅表示它是在其他地方定义的。我发布的原始代码确实可以按预期编译和运行,但仅在 GCC 上。我只是想问是否有更便携的版本具有相同的语义。
    • 据我所知,extern 不是 GCC 的特权,实际上我认为它与您的问题或您想要的行为完全无关。如果您真的不希望您的函数在其范围之外可见,为什么您不只是 #define 函数的内容,而不是声明、定义和使用它?正如我所说,我认为您所问的还有更多 - 尽量避免XY problem
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多