C++ 内联函数:如此声明、如此定义,还是两者兼而有之?为什么?

2023-11-24

以下代码段编译没有问题,即使foo是内联定义的,但没有这样声明,并且bar被声明为内联但未如此定义。

int foo();
inline int foo() { return 3; }

inline int bar();
int bar() { return 4; }

inline int foobar();
inline int foobar() { return 5; }

int main(){
    // ...
}

我的第一个问题: 编译器是否读取foo内联与否?关于什么bar?这是 C++ 标准指定的吗?

我的第二个问题:以下哪一项是声明和定义内联函数的最佳实践?是吗foo? bar? or foobar? Why?


inb4 我读了一些与此相关的其他帖子,但没有一个直接回答我的问题。

This答案似乎表明foo是内联的,但什么也没说bar。也没有解释why foo比其他人更受欢迎。This答案讨论了我何时应该使用内联函数。这不是我关心的:我已经决定使用内联函数。我的问题(准确地说是问题 2)是我是否应该这样声明它、定义它,或者两者兼而有之,以及为什么其中一个约定比其他约定更好。This问题似乎更接近我的担忧,但没有人回答。


对于成员函数来说是正确的,对于非成员函数没有明确定义(我相信)

请参阅 ISO C++ 标准中的 §10.1.6。

内联说明符只能应用于声明或 变量或函数的定义

and

带有内联说明符的函数声明(11.3.5、12.2.1、14.3)声明内联函数。

它没有明确说明如果内联说明符仅修改函数的定义会发生什么。

我们可以确定的是such member函数保证被标记为内联(感谢詹姆斯·柯兰)。

参见第 12.2.1 节。

内联成员函数(无论是静态还是非静态)也可以是 在其类定义之外定义,只要其 类定义中的声明或其定义之外 类定义将函数声明为 inline 或 constexpr。

GCC 和非成员情况下的所有三个职能

与海湾合作委员会一样-O1C++模式,提到的每个函数都是内联的。

Code:

#include "stdio.h"

int foo();
inline int foo() {int i; for(i=0;i<100000;i++); return i+3; }

inline int bar();
int bar() {int i; for(i=0;i<100000;i++); return i+4; }

inline int foobar();
inline int foobar() {int i; for(i=0;i<100000;i++); return i+5; }

int foobar2();
int foobar2() {int i; for(i=0;i<100000;i++); return i+6; }

int main(){
    int a,b,c,d;
    a=foo();
    b=bar();
    c=foobar();
    d=foobar2();
    printf("%d %d %d %d", a, b, c, d);
}

Disassembly: IDA

我们只能看到foobar2叫做。

As in -O2 and -O3, inline没关系。编译器将自行决定(在上面的情况下,所有 4 个函数都是内联的)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 内联函数:如此声明、如此定义,还是两者兼而有之?为什么? 的相关文章

  • 如何在 C++ 中的文件末尾添加数据?

    我已按照网上的说明进行操作 此代码应该将输入添加到文件 数据库 的末尾 但当我检查时 数据会覆盖现有数据 请帮忙 这是我的代码 int main string name string address string handphone cou
  • VB.NET 相当于 C# 属性简写吗?

    是否有与 C 等效的 VB NET public string FirstName get set 我知道你能做到 Public Property name As String Get Return name ToString End Ge
  • std::cout 和 std::wcout 有什么区别?

    在c 中 有什么区别std cout and std wcout 它们都控制流缓冲区的输出或将内容打印到控制台 或者它们只是相似吗 它们作用于不同的字符类型 std cout uses char作为字符类型 std wcout uses w
  • 互斥体实现可以互换(独立于线程实现)

    所有互斥体实现最终都会调用相同的基本系统 硬件调用吗 这意味着它们可以互换吗 具体来说 如果我使用 gnu parallel算法 使用openmp 并且我想让他们称之为线程安全的类我可以使用boost mutex用于锁定 或者我必须编写自己
  • 在 Unity 进程和另一个 C# 进程之间进行本地 IPC 的最快方法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望每秒大约 30 次从 C 应用程序向我的 Unity 应用程序传送大量数据 由于 Unity 不支持映射内存和管道 我考虑了 t
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • 如何访问另一个窗体上的ListView控件

    当单击与 ListView 所在表单不同的表单中的按钮时 我试图填充 ListView 我在 Form1 中创建了一个方法以在 Form2 中使用 并将参数传递给 Form1 中的方法 然后填充 ListView 当我调试时 我得到了传递的
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 如何使用 watin 中的 FileUploadDialogHandler 访问文件上传对话框

    我正在使用 IE8 和 watin 并尝试通过我的网页测试上传文件 我不能简单地使用 set 方法设置上传文件 例如 ie FileUpload Find ById someId Set C Desktop image jpg 因为上传文本
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • 有人可以提供一个使用 Amazon Web Services 的 itemsearch 的 C# 示例吗

    我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收回专辑封面 使用 C 我找不到任何与此接近的示例 所有在线示例都已过时 并且不适用于 AWS 的较新版本 有一个开源项目CodePlex http www c
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • gcc 的配置选项如何确定默认枚举大小(短或非短)?

    我尝试了一些 gcc 编译器来查看默认枚举大小是否很短 至少一个字节 强制使用 fshort enums 或无短 至少 4 个字节 强制使用 fno short enums user host echo Static assert 4 si
  • Server.MapPath - 给定的物理路径,预期的虚拟路径

    我正在使用这行代码 var files Directory GetFiles Server MapPath E ftproot sales 在文件夹中查找文件 但是我收到错误消息说 给定物理路径但虚拟路径 预期的 我对在 C 中使用 Sys
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 线程和 fork()。我该如何处理呢? [复制]

    这个问题在这里已经有答案了 可能的重复 多线程程序中的fork https stackoverflow com questions 1235516 fork in multi threaded program 如果我有一个使用 fork 的
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了

随机推荐

  • System.currentTimeMillis() 如何获取时间

    是方法吗System currentTimeMillis 是否实现对底层操作系统进行系统调用以接收当前时间 我之所以这么问 是因为据我所知 该方法运行得相当快 只需要 6 个 CPU 时钟 但这没有意义 因为众所周知系统调用很慢 我在这里缺
  • 如何在 Android 上进行异步 URL 连接?

    我正在使用以下类连接到我的网络服务 我想让这个异步 我怎样才能做到这一点 package org stocktwits helper import java io BufferedReader import java io IOExcept
  • tmux 绑定分号

    有什么办法可以绑定吗 059 到 tmux 中的命令 默认绑定到last pane 但是 我想将其重新绑定到 select pane R 我尝试将以下内容放入我的 tmux conf 中 但似乎都不起作用 bind 059 select p
  • 在 Html.BeginForm() 中使用 DELETE 表单方法?

    我想尽可能使用适当的 HTTP 方法 在这种情况下 当单击按钮删除某些内容时 我想使用属性触发控制器操作 HttpDelete 但是 我似乎无法使用此方法创建表单 使用 Razor 语法 这FormMethod枚举没有选项Delete并且执
  • 如何在Makefile中添加#define?

    我有一个 C 项目 我需要在一些 CXX 文件中定义一个变量 我有近 800 个文件 我需要为其中 200 个文件定义一个变量 所以我想在 makefile 中定义它 那么我们怎样才能做到这一点呢 只需添加 Dxxx yy在命令行上 xxx
  • 在AppDelegate.m中获取屏幕当前显示的UIViewController

    目前的UIViewController屏幕上的应用程序需要通过设置一些徽章视图来响应来自 APN 的推送通知 但我怎样才能得到UIViewController在方法中application didReceiveRemoteNotificat
  • 每次点击取消按钮时,搜索栏都会向下跳一行

    我已经实现了一个 UISearchBar 来搜索来自外部 API 的项目目录 搜索功能按预期工作 但问题是 每次我按下搜索栏文本字段右侧的取消按钮时 整个搜索栏都会向下移动一行 看起来就像推动了整个搜索栏一样 表格视图也向下 因此 如果我在
  • Android studio:UnsatisfiedLinkError:findLibrary 返回 null - 加载本机库

    我正在 Android Studio 中制作一个使用两个库的应用程序 带有 Android 包装器和 jar 库的本机库 由于某种原因 如果将其他 jar 库编译到项目中 则本机库将不会加载 因此 如果我仅使用本机库运行应用程序 则一切正常
  • 如何让图片连续旋转? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我的屏幕左上角有一个星星图像想要连续旋转 那么谁能告诉我如何让图片在 Mozilla F
  • 如何使用 FFT 绘制 wav 文件的频谱?

    注意 这不是重复的 除了相关问题之外 我还有其他特定要求 首先 我想绘制音频文件 wav 的频谱 就像 audacity 所做的那样 类似 如何从傅里叶变换绘制频谱 到目前为止我已经能够读取和写入 wav 文件了 但我的问题是我不确切知道需
  • python 函数中的动态默认参数

    我需要具有必须在函数运行时设置的默认参数的函数 例如空列表 从其他参数派生的值或从数据库获取的数据 我目前正在使用以下模式来处理此问题 def foo bar baz None baz baz if baz else blar Stuff
  • GHC 优化:Collat​​z 猜想

    我已经编写了代码欧拉计划的挑战 14 同时Haskell and C ideone 链接 他们都记得之前在数组中进行的任何计算 Using ghc O2 and g O3C 的运行速度分别比 Haskell 版本快 10 15 倍 虽然我知
  • 如何使用jquery检查复选框数组中的复选框是否被选中

    I have a html table with a column of text boxes mileage all of them are disabled when the page loads and I need that whe
  • Symfony 形式:上传的文件 - “该值应该是字符串类型”

    更新 2019 06 24 23 28 使用表单上传文件时 遇到以下错误 该值应该是字符串类型 表单生成器设置为FileType正如它应该 FormType class DocumentType extends AbstractType p
  • sbt 程序集错误:重复数据删除:在 io.netty.versions.properties 中找到不同的文件内容

    我已将以下罐子添加到build sbt文件如下 com amazonaws aws java sdk 1 11 492 发布此信息 在合并期间 我收到以下错误 error 1 error was encountered during mer
  • 为什么Global.asax.cs中的Session_Start会导致性能问题?

    当我在 Global asax cs 中创建一个空的 Session Start 处理程序时 在将页面渲染到浏览器时会导致严重的影响 如何重现 创建一个空的 ASP NET MVC 3 Web 应用程序 我使用的是 MVC 3 RC2 然后
  • C++ 和 Qt 5 中的 AES 256 加密

    我有一个用于加密的 Java 代码 如下所示 private static byte encrypt byte raw byte clear throws Exception SecretKeySpec skeySpec new Secre
  • asp mvc home root 不适用于 mono、fastcgi 和 nginx

    我有 mono 2 6 7 我正在尝试移植 ASP NET MVC 应用程序 我通过设置变量 MONO IOMAP all 设法解决了区分大小写的问题 我还有一个问题 我的主根无法工作 我收到页面未找到错误 尽管 home 和 home i
  • Razor:声明性 HTML 帮助器

    我正在尝试编写一个简单的声明式 html 帮助器 helper Echo string input input 如果我将它嵌入到我想要使用它的页面中 该帮助器就可以正常工作 但如果我把它移到一个单独的地方 cshtml文件并将该文件放入 V
  • C++ 内联函数:如此声明、如此定义,还是两者兼而有之?为什么?

    以下代码段编译没有问题 即使foo是内联定义的 但没有这样声明 并且bar被声明为内联但未如此定义 int foo inline int foo return 3 inline int bar int bar return 4 inline