【问题标题】:How to show that function belongs to a typedef in C?如何显示该函数属于 C 中的 typedef?
【发布时间】:2017-03-17 09:53:29
【问题描述】:

如果我有一个函数指针的 typedef,比如

typedef void (* specialFunction) (void);

我怎样才能表明我声明了该类型的函数,而不是巧合地声明了具有相同签名的函数?

我并不想强制执行任何操作,只是为了让代码更清晰(和可维护),并让函数声明很明显,比如计时器回调或 ISR 例程。

显然,我不能

extern specialFunction mySpecialFunction(void);

但是有什么方法可以在声明中使用specialFunction 来区分mySpecialFunctionmyBoringlyNormalFunction

【问题讨论】:

  • 在 C 中,函数是函数是函数。没有什么可以使某些函数(main 除外)比任何其他函数更“特殊”,或者注释函数仅用于特殊目的。您所拥有的只是 cmets 和文档。
  • 例如,您可以像 Adam Dunkels 在 protothreads 中所做的那样使用 PT_THREAD(example(struct pt *pt)) 来声明名称为 example 的函数。更多信息:dunkels.com/adam/pt
  • 这听起来像是一个答案,而不仅仅是评论 (+1)
  • extern specialFunction mySpecialFunction(void); 是合法代码。它将mySpecialFunction 声明为一个不带参数的函数,并返回一个函数指针。从您的问题中不清楚这是否是您的意图
  • 糟糕,抱歉,没有。这不是我想要的(+1)。我打算表明我不能使用 typedef 来声明带有 typedef 签名的函数。

标签: c function pointers maintainability


【解决方案1】:

你不能在这做任何事情。但是,对于视觉表示,您可以使用 protothreads 中的 Adam Dunkels 之类的自我定义:

typedef void (* specialFunction) (void);
#define TIMERCALLBACK(x)         specialFunction x

然后像这样声明函数:

TIMERCALLBACK(mycallback(void)) {
    //do your job
}

这只是将函数表示为timer callback的一种方式。

【讨论】:

  • 是什么阻止了你声明 TIMERCALLBACK(mycallback(int)) 这不是一个特殊功能?
  • 这里我不太明白你的问题。
  • 您实际上并没有将 mycallback 定义为 void mycallback(void) 并因此与 specialFunction 的类型相同 - 您声明它返回一个 specialFunction 这不是 OP 想要的.
  • 这是真的,它可以很容易地与void一起使用。但是在 C 中没有办法做他想做的事,因此我向他展示了另一个如何做视觉表示的原则。
  • 这段代码将mycallback声明为一个返回函数指针的函数;但是我认为 OP 想将 mycallback 声明为返回 void 的函数
【解决方案2】:

void (* specialFunction) (void); 是指针类型。您不能声明指针类型的函数。我假设你的意思是你想声明一个像void f(void); 这样的函数,但基于那个typedef。

如果是这样,您可以将 typedef 设为函数类型:

typedef void specialFunction(void);

然后你可以像这样声明一个该类型的函数和一个指向该函数的指针:

specialFunction func_name;

specialFunction *p_func = &func_name;

许多人认为避免使用指针类型定义使代码更易于阅读,因为* 符号的存在清楚地表明我们是否正在使用指针。

【讨论】:

  • 这很好!然后我可以声明第二个 typdef,它是指向第一个的指针,用于传递此类函数作为参数(例如,在注册回调时)
  • @Mawg 你可以,但我的建议是写specialFunction *而不是使用另一个typedef,因为那样更明显的是类型是指针类型
  • 同意。我将开始向我们的团队介绍这种风格。
【解决方案3】:

你不能像那样声明函数,只能声明变量。但是您可以使用宏来确保您的函数像这样正确声明。

typedef void (* specialFunction) (void);
#define SPECIALFUNCTION(x) void x(void)

extern SPECIALFUNCTION(mycallback);

int main(void)
    {
    specialFunction foo=mycallback;
    foo();
    }

SPECIALFUNCTION(mycallback)
    {
    printf("test\n");
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多