为啥另一个函数中的函数声明会编译,它有啥作用?

Posted

技术标签:

【中文标题】为啥另一个函数中的函数声明会编译,它有啥作用?【英文标题】:Why does a function declaration within another function compile and what does it do?为什么另一个函数中的函数声明会编译,它有什么作用? 【发布时间】:2015-10-13 12:29:36 【问题描述】:

我打算调用一个私有类成员函数,但是由于复制和粘贴错误,粘贴了该行,因为该函数在头文件中声明:

void DebugView::on_cbYAxisEnabled_stateChanged(int)

    void updateAxisEnabled();

而不是

void DebugView::on_cbYAxisEnabled_stateChanged(int)

    updateAxisEnabled();

令人惊讶的是,代码已编译并执行。但是方法updateAxisEnabled()没有被执行。

那么,它为什么会编译?这里是在方法体中声明的本地函数还是 void 指示编译器忽略之后发生的任何事情?

编译器是 Visual Studio 2008。

P.S.:我知道函数中的类声明/定义,但不知道 C++ 函数中的函数。

【问题讨论】:

P.S.: I'm aware of class declaration/definition within functions, but not functions within functions in C++ 好吧,现在你知道这也是可能的。 @deviantfan:我敢肯定,在 C++ 中定义本地函数是不合法的。那么 DELCARE 一个局部函数又不能为它定义一个主体有什么意义呢? @ValentinHeinitz 例如,您是否尝试过使用 g++,我很好奇它是如何工作的。 转发声明任何内容的原因相同;告诉编译器符号的定义存在于别处。 @RichardRublev:是的,似乎有效,在这里尝试过:gcc.godbolt.org 【参考方案1】:

void updateAxisEnabled(); 是一个函数声明

示例:

#include <cstdio>

void a();
void b();

int main(void) 
    a();
    b();
    return 0;


void a() 
    void c(); // Declaration
    c(); // Call it


void b() 
    c(); // Error: not declared


void c() 
    puts("Hello, world!");

【讨论】:

酷!有用。我在这里试过:gcc.godbolt.org。很高兴知道,可以在成员函数中进行前向声明。谢谢!【参考方案2】:

完全允许在函数范围内声明函数:函数可以在任何范围内声明。

C++ 程序员的一个常见错误确实是:

void foo()

    MyObject bar(); // 1
    bar.someMethod(); // 2

这将编译失败,因为第 1 行没有声明一个名为 barMyObject 并显式调用其构造函数;相反,它声明了一个名为bar函数,它返回一个MyObject。因此,确实没有对象可以调用someMethod

【讨论】:

这就是为什么我喜欢使用这种语法来初始化我的变量:MyObject bar; @Just Yes,统一初始化从C++11就可以解决这个问题。 但是请注意,您不能在类范围内声明非成员函数,除非您将其设为友元。 @Brian: 它的语法是什么? @Brian 很奇怪!甚至可以在类声明范围内定义一个全局非成员函数。似乎是另一种情况:mindprod.com/jgloss/unmain.html :-)

以上是关于为啥另一个函数中的函数声明会编译,它有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

c语言中的extern是啥,有啥作用啊?

js中函数的prototype.constructor是指向函数本身,它有啥用

构造函数后面2个括号各有啥作用

C++:为啥必须声明私有函数?

私有构造函数有啥作用? [复制]

呈现 JSX 的函数与在另一个组件中声明组件的函数有啥区别?