- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试 extern 一个内联函数。我认为它应该如何工作:
//a.cpp
inline void f(int) {}
//b.cpp
extern void f(int);
int main() { f(4); }
但是出现链接错误。然后通过阅读 this ("1) 它必须在每个翻译单元中声明为内联
。")。我试过的:
//a.cpp
inline void f(int) {}
//b.cpp
extern inline void f(int);
int main() { f(4); }
仍然收到链接错误。但是现在,尝试一些我不知道自己在做什么的事情:
//a.cpp
extern inline void f(int) {}
//b.cpp
extern inline void f(int);
int main() { f(4); }
它有效。这里发生了什么事?在为所有内容添加extern
之前,a.cpp
中的f
是否具有内部链接?
我将 MSVC 2017 (v141) 与 /permissive-
和 /std:c++17
一起使用
最佳答案
I'm trying to extern an inline function.
没有理由将 extern
与函数一起使用。参见 storage duration - linkage .函数默认有外部链接;为了没有外部链接,需要做一些特殊的事情(即将它放在匿名命名空间中或将其声明为 static
)。因此,内联函数的正常使用已经展示了不需要 extern
关键字的外部链接。
How I thought it should work:
//a.cpp
inline void f(int) {}
//b.cpp
extern void f(int);
int main() { f(4); }Then by reading this ("1) It must be declared
inline
in every translation unit.").
该引用是正确的,但在它说 “内联函数的定义 [...] 必须出现在访问它的翻译单元中 [...]”的地方多看一点。 您的示例在 b.cpp
中有一个 f
声明,但没有定义。如果要从 b.cpp
调用 f
,则需要该翻译单元中的完整定义,如:
inline void f(int) {}
(这与存在于 a.cpp
中的代码相同。)如果你去掉大括号,那么你有一个声明而不是一个定义,这使得调用 是非法的f
来自那个翻译单元。
基本上,在头文件之外定义一个内联函数真的很痛苦,除非你给它内部链接。这是因为每个使用内联函数的源文件都需要自己的函数体拷贝,这意味着如果您更改函数,则需要在多个文件中进行更改。钱币。不要这样做。在头文件中定义每个 inline
函数。如果您认为要在源文件中定义一个,您可能会误解“inline
”的含义。
“内联
”是什么意思?
就编译器而言,inline
关键字(几乎)没有任何意义。它只是函数定义上的一个标志,它会传播到目标代码中,以便链接器 看到它。编译器像处理任何其他函数一样处理该函数。该函数可以正常调用,也可以内联调用 - 就像任何其他函数一样。
编译器可能对 inline
标志做某事的一种情况是当一个函数被声明为 inline
时,它被使用,但缺少定义。这是一个可以在链接器接管之前捕获的错误。它不必被编译器捕获,但它可以。 (如果没有被编译器捕获,它会被链接器捕获。)
进入链接阶段。当链接器看到 inline
标志时,它会暂停该函数的单一定义规则。链接器希望在编译器优化后仍使用该函数的每个翻译单元中看到该函数的定义。它可以选择这些定义中的任何一个作为最终实现。这就是所有定义必须匹配的原因。
仅此而已。 inline
关键字基本上意味着函数定义在头文件中。它告诉链接器当该定义出现在多个翻译单元中时不要提示,因为这是预期的。
回到这个问题,看起来意图是声明一个 inline
函数,其定义将只出现在一个翻译单元中。换句话说,该函数将被标记为在多个翻译单元中定义,但定义将只在一个翻译单元中。那里有点不一致,如果不是完全矛盾的话。
关于c++ - inline 是否确定内部链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56349383/
看看这个 fiddle http://jsfiddle.net/9S4zc/2/ 为什么这在 firefox 和 chrome 中看起来不同(文本对齐方式不同) 如何让 inner:before 元素
我从文档中了解到的是 %{ %} 之间的内容。被插入到包装器中,%inline %{ %} 呢? ? 是一样的吗?如果不是,有什么区别? 也许我们可以找到很多%inline %{ %}的出现。但仅出现
当我使用 显示:inline-flex; 或 显示:内联网格; 似乎有一些额外的“空间”或某种额外的重点计算发生。我不确定到底发生了什么。当使用箭头键在 contentediatble div 中导航
如果我想让一个 div 与容器 div 的其他内联元素内联,而我的目的仅此而已,我应该更喜欢使用 inline-block 或 display property 还是 inline-flex?不能使用
这个问题在这里已经有了答案: Why does an inline-block align to top if it has no content? (2 个答案) 关闭 8 年前。
Ada 信息交换所 states the following : The use of pragma Inline does have its disadvantages. It can create
Name
我问这个基本问题是为了让记录更正。已转介 this question和 its currently accepted answer ,这没有说服力。然而second most voted answer
你好, 在管理面板中,我创建了用于添加产品的表单。表单包括 2 个内联表单集,因为有一些与产品相关的模型。用户可以创建产品,然后定义该产品的不同属性的变体。我将举例说明这一点。用户拥有一个品牌的 3
有很多关于 inline 的使用以及如何正确执行此操作以达到所需目的的信息,例如此处(我目前将其用作引用)Inline Functions in C . 当我尝试实现页面中指定的内容时,出现编译器错误
我正在编写 gtk 代码。我经常有不需要闭包的简短回调,因为它们传递了它们需要的所有参数。例如,我在创建一些 gtk.TreeViewColumns 时将其置于循环中: def widthChange
这个问题在这里已经有了答案: What is the difference between display: inline and display: inline-block? (7 个答案) 关闭
我已经搜索了很长时间来找到答案,但是我没有找到解决方案... 我制作了一个无序列表的链接,并将它们放在标题下,就像导航栏一样。然而,在 IE 中(是的那个恶魔..)我的链接似乎没有对齐到中间。下面是我
我想将两张 table 并排放置。由于我不是 floating 或使用“css hacks”的忠实拥护者,您有什么建议?没有它是否可以解决,还是我运气不好? 最佳答案 使用 table-cell显示以
这个问题在这里已经有了答案: Why is this inline-block element pushed downward? (8 个答案) 关闭 6 年前。
CSS display 的 inline 和 inline-block 值到底有什么区别? 最佳答案 视觉答案 想象一个 中的元素.如果你给 例如,元素高度为 100px 和红色边框,它看起来像这
我想使用 /纯 CSS 弹出窗口的标签,但是 表现为内联 block ,我无法将其更改为内联。 有没有办法强制表现得像 display:inline 而不是 inline-block?
我的想法是这是不可能的,或者我缺少一个额外的步骤。无论哪种方式,我都被卡住了,无法弄清楚。 使用内联模板的原因是能够使用 Laravel Blade 语法并结合 Vue Js 的强大功能。似乎是两者中
http://christianselig.com/wp/ 对于主导航,如果我使用 display: inline,它们将显示为 block 。我心血来潮添加了 display: inline-blo
Firefox 的 -moz-inline-box 和 -moz-inline-stack 专有显示值有什么区别? 最佳答案 https://developer.mozilla.org/en/CSS/
我是一名优秀的程序员,十分优秀!