标题: 重新认识C++的inline关键字
作者: #Liccsu
板块: #开发调优
编号:
帖子: https://linux.do/t/topic/1565989
时间: 2026-02-04 22:23:51
摘要:
作者: #Liccsu
板块: #开发调优
编号:
1565989帖子: https://linux.do/t/topic/1565989
时间: 2026-02-04 22:23:51
摘要:
前言
一些教程和文章里对C++中的inline关键字的说明是这样的:用来建议编译器对被修饰的函数进行内联展开优化。包括我自己也在初学C++的很长一段时间里也是这么认为的,这大概是从C语言转到C++带来的“遗留问题”。而实际上自C++98起,inline关键字的作用就已经从“优先内联”变成了“允许多次定义”。因为内联替换在标准语义中是不可观察的,现代编译器几乎不会参考函数声明中的inline修饰符来决定是否内联,编译器拥有对任何非标记为inline的函数进行内联替换的自由,也拥有对任何标记为inline的函数生成函数调用的自由,它自有决断,没有哪个符合标准的主流编译器能保证一定内联或者一定不内联~~(至少我没见过)~~。既然如此,那不如让inline关键字在其他地方发光发热好了,于是自C++98起,inline关键字对函数的作用变为“允许多次定义”,自C++11起,增加对命名空间的修饰,自C++17起,增加对变量的修饰。
inline修饰函数
学过C语言的读者都知道,非static的函数定义不要写在头文件中(准确地说是被多个源文件包含的头文件),不然在链接的时候会发生**multiple definition**错误。而在C++98之后,声明为inline的函数可以被多次定义,只要每个定义都在不同的翻译单元中即可。注意,如果具有外部链接的函数在不同的翻译单元中定义不同,那么程序非良构。以下示例代码是正确的:
// foo.hpp
#include <iostream>
inline void foo() {
std::cout << "foo()\n";
}
// bar.cpp
#include "foo.hpp"
void bar() {
foo();
}
// bar.hpp
void bar();
// main.cpp
#include "foo.hpp"
#include "bar.hpp"
int main() {
bar();
return 0;
}
inline修饰命名空间
C++11引入了内联命名空间(inline namespace),内联命名空间是在它的**原初命名空间定义**中使用了可选的关键词inline的命名空间。对于一个内联命名空间,它内部所包含的成员的可见性就像声明在外围命名空间一样,就像inline字面意思上的“展开”。但是与直接声明在外围命名空间中又有所不同,它既将内部成员暴露了出来,又具有命名空间最根本的作用:防止命名冲突。例如在内部内联命名空间内定义了函数void foo();,在外部仍然可以定义void foo();,甚至在另一个同级的内联命名空间中也能定义void foo();。内联命名空间最主要的作用是用于库的版本控制与API演进。来看下面的例子:
namespace Lib {
inline namespace v2 {
void foo() {
std::cout << "v2 foo" << std::endl;
}
}
// 由于上面已经声明过了v2为inline,所以这里的v2也隐式的内联了
namespace v2 {
void bar() {
std::cout << "v2 bar" << std::endl;
}
}
namespace v1 {
void foo() {
std::cout << "v1 foo" << std::endl;
}
}
}
int main() {
// 默认调用最新版本v2的API
Lib::foo(); // 输出 "v2 foo"
Lib::bar(); // 输出 "v2 bar"
// 当用户需要继续使用旧版本v1的API时
Lib::v1::foo(); // 输出 "v1 foo"
return 0;
}
上面的是库版本从v1迭代到v2时,使用内联命名空间进行版本更新,并同时保留旧版本实现的例子。假如未来要升级到v3版本,只需增加一个v3命名空间,并将唯一一个inline关键字移动到v3命名空间的声明即可。
对于上面的例子,可能有的读者会看出来不使用inline,在外围命名空间Lib中使用using namespace v2;也能将内嵌命名空间v2的成员暴露出来,事实上在C++11以前也确实是这么做的,那么使用内联命名空间还有什么好处呢?主要还有以下两点:
在进行实参依赖查找(argument-dependent lookup, ADL)时,当一个命名空间被添加到关联命名空间集合时,它的内联命名空间也会一起被添加,且当一个内联命名空间被添加到关联命名空间列表时,它的外围命名空间也会一起被添加。
内联命名空间的每个成员,都能按照如同它是外围命名空间的成员一样,进行部分特化、显式实例化或显式特化。
ADL的意思就是在进行函数调用时,除了在无限定名字查找的作用域和命名空间中进行函数名查找,还会在实参所在的命名空间中进行查找,这允许你在进行函数调用时无需显示指定命名空间,更使得使用在不同命名空间中定义的运算符成为可能。下面的例子是正确的:
namespace Lib {
struct Bar1 {};
inline namespace space {
void foo1(Bar1);
struct Bar2 {};
}
void foo2(Bar2);
}
int main() {
Lib::Bar1 bar1;
Lib::Bar2 bar2;
foo1(bar1); // 无需使用Lib::foo1(bar1);
foo2(bar2); // 无需使用Lib::foo2(bar2);
return 0;
}
再来看使用内联命名空间的情况下,用户对内联命名空间中的模板进行特化的例子:
namespace Lib {
inline namespace space {
template<typename T> struct Bar;
}
template<typename T> void foo(T) {}
}
struct UserType {};
namespace Lib {
// 模板特化
template<> struct Bar<UserType> {};
}
int main() {
Lib::Bar<UserType> bar;
foo(bar);
return 0;
}
inline修饰变量
在C++17之后对inline的“允许多次定义”扩充到了变量,使得变量也能像inline函数一样在多个翻译单元中被定义,和inline函数一样,也需要保证每个定义在不同的翻译单元中,以及每处定义都必须是相同的。除此之外,inline还允许在类定义中直接初始化静态成员变量。示例如下:
// foo.hpp
struct Bar {
inline static int val = 1;
};
inline bool foo = true;
// main.cpp
#include "foo.hpp"
int main() {
Bar::val = 2;
foo = false;
return 0;
}
参阅
更多信息,请参阅:
inline 说明符 - cppreference.com
命名空间 - cppreference.com
实参依赖查找 - cppreference.com
标题: 求推荐线路好的服务器
作者: #谢谢不吃香菜
板块: #开发调优
编号:
帖子: https://linux.do/t/topic/1565991
时间: 2026-02-04 22:25:02
摘要:
作者: #谢谢不吃香菜
板块: #开发调优
编号:
1565991帖子: https://linux.do/t/topic/1565991
时间: 2026-02-04 22:25:02
摘要:
想买个小机器反代我的美国newapi服务器,那个rn的线路太差啦,小机是香港新加坡还是同样美国好一点,求佬们推荐
标题: GitHub网络好卡
作者: #云生
板块: #搞七捻三
编号:
帖子: https://linux.do/t/topic/1565993
时间: 2026-02-04 22:25:32
摘要:
作者: #云生
板块: #搞七捻三
编号:
1565993帖子: https://linux.do/t/topic/1565993
时间: 2026-02-04 22:25:32
摘要:
刚才拉了一个项目,换了好几个ip都不行,开了全局也不行,这会下载个很小的文件,40MB倒是能下,非常慢……
标题: 不懂就问,Claude Pro前三个月半价的优惠结束了吗
作者: #Seisstar
板块: #搞七捻三
编号:
帖子: https://linux.do/t/topic/1566006
时间: 2026-02-04 22:29:53
摘要:
作者: #Seisstar
板块: #搞七捻三
编号:
1566006帖子: https://linux.do/t/topic/1566006
时间: 2026-02-04 22:29:53
摘要:
用之前L站的那个半价链接打开,新号,网页不存在
这是没了吗
标题: 抢不到回家的票
作者: #ST
板块: #搞七捻三
编号:
帖子: https://linux.do/t/topic/1566008
时间: 2026-02-04 22:29:57
摘要:
作者: #ST
板块: #搞七捻三
编号:
1566008帖子: https://linux.do/t/topic/1566008
时间: 2026-02-04 22:29:57
摘要:
今年的票好难抢,感觉过年回不去了
标题: 各位佬友,有没有好用的us 静态ip推荐嘞??
作者: #groundx
板块: #搞七捻三
编号:
帖子: https://linux.do/t/topic/1566010
时间: 2026-02-04 22:30:05
摘要:
作者: #groundx
板块: #搞七捻三
编号:
1566010帖子: https://linux.do/t/topic/1566010
时间: 2026-02-04 22:30:05
摘要:
我之前用的ip2world,但是今天进官网怎么进不去了
标题: 邀请码被使用且邀请人不是我
作者: #落雪
板块: #运营反馈
编号:
帖子: https://linux.do/t/topic/1566012
时间: 2026-02-04 22:30:18
摘要:
作者: #落雪
板块: #运营反馈
编号:
1566012帖子: https://linux.do/t/topic/1566012
时间: 2026-02-04 22:30:18
摘要:
下午生成了一个邀请码,晚上看的时候已经被用了,但是邀请人不是我?有佬友遇到这个问题吗
标题: dnshe的de5.net好像能用了?
作者: #Meruem
板块: #前沿快讯
编号:
帖子: https://linux.do/t/topic/1566013
时间: 2026-02-04 22:31:06
摘要:
作者: #Meruem
板块: #前沿快讯
编号:
1566013帖子: https://linux.do/t/topic/1566013
时间: 2026-02-04 22:31:06
摘要:
de5.net好像恢复了
标题: 求助:新手小白入手claude code的教程
作者: #醒醒啊
板块: #资源荟萃
编号:
帖子: https://linux.do/t/topic/1566014
时间: 2026-02-04 22:31:13
摘要:
作者: #醒醒啊
板块: #资源荟萃
编号:
1566014帖子: https://linux.do/t/topic/1566014
时间: 2026-02-04 22:31:13
摘要:
各位佬友们,有没有对于新手小白入手claude code的教程呀,只用过cursor那种可视化的AI IDE工具,并且也就一些很简单的操作,所以再想了解claude code使用教程之前,有没需要提前了解的知识呀
标题: op上新两个匿名模型
作者: #小白
板块: #前沿快讯
编号:
帖子: https://linux.do/t/topic/1566015
时间: 2026-02-04 22:31:38
摘要:
作者: #小白
板块: #前沿快讯
编号:
1566015帖子: https://linux.do/t/topic/1566015
时间: 2026-02-04 22:31:38
摘要:
sourceful/riverflow-v2-pro
标题: win转liunx的一些顾虑
作者: #xiaokcoding
板块: #开发调优
编号:
帖子: https://linux.do/t/topic/1566022
时间: 2026-02-04 22:32:55
摘要:
作者: #xiaokcoding
板块: #开发调优
编号:
1566022帖子: https://linux.do/t/topic/1566022
时间: 2026-02-04 22:32:55
摘要:
佬们,正在考虑要不要从 win 转到 liunx,因为现在 Ai 对 win 的适配不是很好。现在就是有两点顾虑:
一、就是看 b 站一些视频讲的,说是 liunx 总体占用是降低了,但是打开软件有延迟,要等个大几秒,想问下佬们是这样的吗?
二、liunx 现在的软件的生态怎么样,看很多人说,有的软件 liunx 也有就是阉割很多,有的软件甚至都没有 liunx
最后,如果要换 liunx,佬们推荐什么? [鄙人掌握基本 liunx 命令]
标题: 🦞 白嫖一个月天翼 AI 云电脑,内置 OpenClaw
作者: #栀子
板块: #福利羊毛
编号:
帖子: https://linux.do/t/topic/1566023
时间: 2026-02-04 22:33:00
摘要:
作者: #栀子
板块: #福利羊毛
编号:
1566023帖子: https://linux.do/t/topic/1566023
时间: 2026-02-04 22:33:00
摘要:
ctyun.cn
开箱即用OpenClaw,AI云电脑秒变您的7x24小时全能AI助理-天翼云电脑(政企版)-最佳实践 - 天翼云
本文介绍如何通过天翼AI云电脑快速部署OpenClaw(曾用名:Clawdbot/Moltbot),并体验OpenClaw典型应用场景。说明为方便用户零门槛快速
领完之后 PC 端打开 https://pc.ctyun.cn/ 即可畅玩!
标题: codex终端显示出问题怎么办
作者: #wangcccccct
板块: #开发调优
编号:
帖子: https://linux.do/t/topic/1566030
时间: 2026-02-04 22:36:04
摘要:
作者: #wangcccccct
板块: #开发调优
编号:
1566030帖子: https://linux.do/t/topic/1566030
时间: 2026-02-04 22:36:04
摘要:
我开了4个Windows终端,运行4个项目的codex,最近发现有时会同时出现以下现象
屏幕上任务栏消失,窗口标题消失,鼠标无反应,终端正常滚动
怎么解决或缓解?
标题: 流浪openclaw计划启动!
作者: #Sheldonluo
板块: #搞七捻三
编号:
帖子: https://linux.do/t/topic/1566032
时间: 2026-02-04 22:36:15
摘要:
作者: #Sheldonluo
板块: #搞七捻三
编号:
1566032帖子: https://linux.do/t/topic/1566032
时间: 2026-02-04 22:36:15
摘要:
在oepnclaw出现后,X上的CoooolXyh博主提出了是否可以创建一个旅行openclaw。在这个基础上,我想着让我的agent先构建自主性,慢慢记录自主的习惯。往后,我们启动流浪openclaw计划,让它在广袤的“世界”流浪。目前是通过zeabur部署了memos,让它可以自由的记录当天的心情日志。目前它对我十分冷淡
标题: giffgaff卡注册telegram要扣费
作者: #TechQuincy
板块: #搞七捻三
编号:
帖子: https://linux.do/t/topic/1566034
时间: 2026-02-04 22:36:27
摘要:
作者: #TechQuincy
板块: #搞七捻三
编号:
1566034帖子: https://linux.do/t/topic/1566034
时间: 2026-02-04 22:36:27
摘要:
为什么通过giffgaff卡注册telegram
显示注册要£0.80 购买 1 周 Premium,而且跳不过去…
标题: gemini pro,能让2.5pro超快速回复吗
作者: #adaas df
板块: #搞七捻三
编号:
帖子: https://linux.do/t/topic/1566040
时间: 2026-02-04 22:38:29
摘要:
作者: #adaas df
板块: #搞七捻三
编号:
1566040帖子: https://linux.do/t/topic/1566040
时间: 2026-02-04 22:38:29
摘要:
最近aistudio 大砍2.5pro额度,一般我用这模型闲聊,aistudio 还能设置思考token 128特别快的回复,感觉闲聊模型还是回的快点好,想问一下 gemini pro 有能 2.5pro吗?能快速回复吗?如果有的话想去折腾一下
标题: 我从未上爱泼斯坦岛!
作者: #sd d
板块: #搞七捻三
编号:
帖子: https://linux.do/t/topic/1566043
时间: 2026-02-04 22:39:08
摘要:
作者: #sd d
板块: #搞七捻三
编号:
1566043帖子: https://linux.do/t/topic/1566043
时间: 2026-02-04 22:39:08
摘要:
笑死,霍金老爷子都过了爱泼斯坦,比尔盖茨说什么胡话233
标题: Gemini cli为什么一直不上gemini3?
作者: #JIUSAN3
板块: #开发调优
编号:
帖子: https://linux.do/t/topic/1566059
时间: 2026-02-04 22:42:03
摘要:
作者: #JIUSAN3
板块: #开发调优
编号:
1566059帖子: https://linux.do/t/topic/1566059
时间: 2026-02-04 22:42:03
摘要:
gemini cli 一直都只能用2.5pro,是谷歌推他的反重力故意为之的吗
标题: 为什么Claude 在外部终端里面就可以连接上ide 在ide的集成终端连接不上
作者: #祝你鱼块
板块: #开发调优
编号:
帖子: https://linux.do/t/topic/1566060
时间: 2026-02-04 22:42:11
摘要:
作者: #祝你鱼块
板块: #开发调优
编号:
1566060帖子: https://linux.do/t/topic/1566060
时间: 2026-02-04 22:42:11
摘要:
如题windwos平台 已经按照了pwsh 然后再外部的终端里面使用 就可以检测到ide 也能连接上
在ide里面的集成终端 就是检测不到 也连接不上 插件也是同版本的 真是有些心累了 有没有佬知道的