在其他函数体中声明函数方法的用例是什么

What is the use case of declaring functions methods within bodies other functions?

本文关键字:是什么 方法 函数 其他 函数体 声明      更新时间:2023-10-16

我在FreeRTOS中看到了这篇文章来源:

void vApplicationIdleHook( void )
{
    /* The simple blinky demo does not use the idle hook - the full demo does. */
    #if( mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 0 )
    {
        extern void vFullDemoIdleHook( void );
        //* Implemented in main_full.c. */
        vFullDemoIdleHook();
    }
    #endif
}

为什么要这样声明函数/方法?优点是什么?我在Java中也看到过类似的代码。

我假设这是项目中唯一使用vFullDemoIdleHook的地方,所以很明显&简洁,只需在这几行代码中保留声明和函数调用即可。

把声明放在其他地方有什么好处?考虑另一种选择。。。这可能是你更习惯看到的:

/* The simple blinky demo does not use the idle hook - the full demo does. */
#if( mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 0 )
extern void vFullDemoIdleHook( void );
#endif

void vApplicationIdleHook( void )
{
  /* The simple blinky demo does not use the idle hook - the full demo does. */
  #if( mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 0 )
  {
    //* Implemented in main_full.c. */
    vFullDemoIdleHook();
  }
  #endif
}

我认为这个没有任何优势

我想说,没有理由在函数内部声明函数,因为这会给一种错误的印象,即它在某种程度上仅限于该函数,而事实并非如此。默认情况下,函数具有外部链接(此外,您的代码还专门为函数vFullDemoIdleHook()指定了extern),并且声明内部函数应该被认为是一种糟糕的做法(但有效)。

原型应该在头文件中(如果没有头,则在源文件的顶部)。我会把申报单移到main_full.h:

 extern void vFullDemoIdleHook( void ); /* extern keyword is redundant here */

main_full.c:

void vApplicationIdleHook( void )
{
    /* The simple blinky demo does not use the idle hook - the full demo does. */
    #if( mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 0 )
    {
        //* Implemented in main_full.c. */
        vFullDemoIdleHook();
    }
    #endif
}

除非您打算将相同的函数名vFullDemoIdleHook用于不同的目的(这将非常糟糕),否则不需要有条件地(#if)声明函数原型。