C++:在另一个函数中声明一个函数不是编译器错误,那么...它是什么?

2024-03-28

我无意中编译了一个与此类似的源:

//void y(); //optionally declaring y()

void x()
{
  //some code...
  void y();
  //some code...
}

//void y() {/*some code*/} //optionally defining y()

这是用 VS 2017 和两个 clang 版本编译的。这些编译器都没有抱怨这个源代码——没有错误,没有警告。我的代码中有一个拼写错误——在这个例子中,不应该有void在...前面y()因此y()应该被调用,所以这是一个相当隐蔽的错误,在编译时没有明显的后果。

我很好奇编译器在想什么。尝试调试代码,void y();里面的线x()无法访问,因此似乎没有生成实际的机器代码。我用这个测试了void y() {/*somecode*/}上面声明并下面定义的函数x()也没有这样的功能——没有区别。

编译器是否认为这是一个声明?如果是这样,在 C++ 中不允许以这种方式(不是谈论 lambda)在函数内定义函数时,如何进一步使用 this ?我假设,如果这样的声明在函数内部有效,那么如果想在函数内部定义函数,那么这将是最有意义的x()以及,否则声明y()可以移到外面和上面x().

编辑:相关讨论和解释:

  • 函数内部的函数声明——为什么? https://stackoverflow.com/questions/29746768/function-declaration-inside-of-function-why
  • 语法歧义——最令人烦恼的解析 https://en.wikipedia.org/wiki/Most_vexing_parse

我很好奇编译器在想什么。

它认为您通过名称声明了一个函数y返回void并且有一个空的参数列表。void y();是一个函数声明。

编译器是否认为这是一个声明?

Yes.

如果是这样,当 C++ 中不允许嵌套函数时,如何进一步使用它?

例如,您可以使用函数声明来调用它,或者获取它的地址。就像这样:

void x()
{
    void y(); // a function declaration

    // now that y has been declared, it can be called:
    y();      // a function call

    // also, it is now possible to take the address:
    void (*fun_ptr)() = y;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++:在另一个函数中声明一个函数不是编译器错误,那么...它是什么? 的相关文章

随机推荐

  • 计算文件中的字长

    所以我的函数应该打开一个文件并计算字长并给出输出 例如 许多 样本 txt 字长1 2 长度为 2 的单词 6 长度为 3 的单词 7 长度为 4 的单词 6 我的sample txt 文件包含 这是一个测试文件 1 个字的长度是多少 长度
  • 将 ProcessStartInfo.WorkingDirectory 设置为 UNC 路径

    我有一个用 VB net 编写的实用程序 它作为计划任务运行 它在内部调用另一个可执行文件 并且必须访问映射驱动器 显然 Windows 在用户未登录时访问映射驱动器的计划任务存在问题 即使向任务本身提供了身份验证凭据也是如此 好的 为了解
  • document.querySelector 获取包含括号的类名

    我正在编写的软件必须与我无法控制的第三方网络应用程序的 dom 配合使用 有些类名带有参数 例如class view box 200px 我猜这些类名是 Sass Less mixins arguments document querySe
  • 按文本而不是值对 Datagridview 的列进行排序

    我的 datagridview 中有一个列是组合框列 我希望它按其显示值 即文本 而不是其值 在本例中为数据库中的 int 列表 排序 我怎样才能做到这一点 您可以通过覆盖来做到这一点SortCompare事件于DataGridView w
  • Google App-Gmail 无法设置。通过 swiftmailer SMTP 传输 (PHP) 发送时 Gmail 替换地址

    您好 感谢您提前提供的任何帮助 我正在使用 swiftmailer SMTP 传输方法从我的 PHP 脚本发送电子邮件 发送消息就好了 有用 问题是 无论我将 FROM REPLYTO SENDER 设置为什么 电子邮件都会作为 GMAIL
  • Spring:具有自动装配依赖项的通用类

    我有一个标准的 Spring Boot MVC 应用程序 其中包含许多实体以及相应的存储库和服务 组件之间共享许多基础设施 因此我想将其抽象为通用类 我目前正在尝试实现这一目标的方式是这样的 仅显示传达想法的框架 interface Abs
  • CGAffineTransformMakeScale() 动画后扭曲视图框架

    我正在使用 theCGAffineTransformMakeScale 对视图进行动画处理 使其看起来像从屏幕中心生长一样 它在 iOS 8 beta 4 模拟器中运行良好 但在 7 1 版本中它会扭曲视图的框架 view alpha 0
  • 使用 UTF-8 的 getBytes() 不适用于大写德语变音符号

    为了开发我正在使用ResourceBundle直接从 IDE 中的资源目录读取 UTF 8 编码的属性文件 我在该文件的 Eclipse 文件属性中设置 native2ascii 用于生产 例如 menu file open label f
  • Android可取消启动画面

    我正在尝试按照以下规则创建一个具有横幅和取消按钮的启动页面 如果没有按下任何按钮 5 秒后转到主要活动 如果按下取消按钮 则立即转到主要活动 如果横幅被按下 则转到其他活动 My code public class BannerSplash
  • java.net.SocketException:打开的文件太多

    我有一个java应用程序 它运行得很好 在Ubuntu 10 04上 几个小时 直到它遇到 java net SocketException 打开文件太多 Sender java的代码可以找到here https code google c
  • 在 ansible shell 命令中使用 {{ 和 }}

    我的剧本里有这个 name Get facts about containers shell docker ps f name jenkins format raw Names endraw register container 请注意 我
  • Extjs4 在组合框中添加一个空选项

    我在 ExtJS4 中有一个带有此初始配置的组合框 xtype combobox name myCombo store MyStore editable false displayField name valueField id empty
  • 将 Hessian 矩阵定义为零

    在使用 scipy optimize minimize 和 trust constr 方法时 我得到了这个 UserWarning scipy optimize hessian update strategy py 187 UserWarn
  • 为什么 token.py 的存在会导致内置 help() 崩溃? [复制]

    这个问题在这里已经有答案了 作为一个爱好 学习项目 我正在用 Python 编写一个解析器生成器 我的一个代码文件名为 token py 其中包含几个用于将纯字符串转换为 Token 对象的类 我刚刚发现 在 Python 中使用控制台中的
  • ASPNETDB.MDF 文件未显示在 APP_DATA 中

    我正在了解 Microsoft 关于 MVC 2 表单身份验证的演练 http msdn microsoft com en us library ff398049 aspx http msdn microsoft com en us lib
  • 找不到 support-fragment.jar (com.android.support:support-fragment:27.0.2)

    我克隆了我的项目并使用 Android studio 打开 但构建失败并出现以下错误同一个项目对其他人来说运行良好 What went wrong Could not resolve all files for configuration
  • 字符串比较 Objective-C

    我一直在努力进行简单的比较 但无法让它发挥作用 我正在读取一个 XML 文件 我需要比较其中的数据才能显示正确的图片 http www cleaner se larm xml http www cleaner se larm xml 解析示
  • 带有数字键的 Django postgres Json 字段

    我有带有 postgres json 字段的模型 class MyModel models Model data JSONField null True 然后 我这样做 m1 MyModel objects create data 10 2
  • 摆脱 django testsuite 中的空 models.py

    我有两个纯服务应用程序 它们充当我的核心模型的仆人 因此 他们没有任何自己的模型 虽然第一个服务的测试套件运行良好 但第二个服务会抛出以下错误 django core exceptions ImproperlyConfigured App
  • C++:在另一个函数中声明一个函数不是编译器错误,那么...它是什么?

    我无意中编译了一个与此类似的源 void y optionally declaring y void x some code void y some code void y some code optionally defining y 这