为啥另一个函数中的函数声明会编译,它有啥作用?
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 行没有声明一个名为 bar
的 MyObject
并显式调用其构造函数;相反,它声明了一个名为bar
的函数,它返回一个MyObject
。因此,确实没有对象可以调用someMethod
。
【讨论】:
这就是为什么我喜欢使用这种语法来初始化我的变量:MyObject bar;
@Just Yes,统一初始化从C++11就可以解决这个问题。
但是请注意,您不能在类范围内声明非成员函数,除非您将其设为友元。
@Brian: 它的语法是什么?
@Brian 很奇怪!甚至可以在类声明范围内定义一个全局非成员函数。似乎是另一种情况:mindprod.com/jgloss/unmain.html :-)以上是关于为啥另一个函数中的函数声明会编译,它有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章