由于模板是在头文件中定义的,编译器能够确定内联函数是否有利,它是否有意义?我听说现代编译器更好地知道何时内联函数并忽略inline提示.
编辑:我想接受这两个答案,但这是不可能的.为了解决这个问题,我接受了菲涅耳的回答,因为它收到了大多数选票并且他是正式的,但正如我在评论中所提到的,我从不同的角度考虑Puppy和组件10的答案也是正确的. .
问题出在C++语义中,在inline关键字和内联的情况下并不严格.Phresnel说"如果你的意思是写内联",但实际意义inline并不明确,因为它从原来的意义演变为"阻止编译人员讨论ODR违规"的指令,正如Puppy所说.
注意:这不是关于如何使用内联函数或它们如何工作的问题,更多的是为什么它们按照它们的方式完成.
类成员函数的声明不需要定义函数inline,它只是函数的实际实现.例如,在头文件中:
struct foo{
void bar(); // no need to define this as inline
}
Run Code Online (Sandbox Code Playgroud)
那么,为什么一类功能的内嵌实施有是在头文件?为什么我不能把内联函数放在.cpp文件中?如果我在哪里尝试将内联定义放在.cpp文件中,我会得到一个错误:
error LNK2019: unresolved external symbol
"public: void __thiscall foo::bar(void)"
(?bar@foo@@QAEXXZ) referenced in function _main
1>C:\Users\Me\Documents\Visual Studio 2012\Projects\inline\Debug\inline.exe
: fatal error LNK1120: 1 unresolved externals
Run Code Online (Sandbox Code Playgroud) 通过电子邮件将图像作为嵌入图像发送到正文中时出现问题.图像文件显示为附件,但是内嵌图像部分显示为红色x.
这是我到目前为止所拥有的
LinkedResource inline = new LinkedResource(filePath);
inline.ContentId = Guid.NewGuid().ToString();
MailMessage mail = new MailMessage();
Attachment att = new Attachment(filePath);
att.ContentDisposition.Inline = true;
mail.From = from_email;
mail.To.Add(data.email);
mail.Subject = "Client: " + data.client_id + " Has Sent You A Screenshot";
mail.Body = String.Format(
"<h3>Client: " + data.client_id + " Has Sent You A Screenshot</h3>" +
@"<img src=""cid:{0}"" />", inline.ContentId);
mail.IsBodyHtml = true;
mail.Attachments.Add(att);
Run Code Online (Sandbox Code Playgroud) 如果我的html中有以下内容:
<div style="height:300px; width:300px; background-color:#ffffff;"></div>
Run Code Online (Sandbox Code Playgroud)
这在我的css样式表中:
div {
width:100px;
height:100px;
background-color:#000000;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法,使用javascript/jquery,删除所有内联样式,只留下由CSS样式表指定的样式?
当我尝试构建此代码时
inline void f() {}
int main()
{
f();
}
Run Code Online (Sandbox Code Playgroud)
使用命令行
gcc -std=c99 -o a a.c
Run Code Online (Sandbox Code Playgroud)
我收到链接器错误(未定义引用f).如果我使用static inline或extern inline代替just inline,或者如果我使用-O(因此函数实际内联),则错误消失.
这种行为似乎在C99标准第6.7.4(6)段中定义:
如果转换单元中函数的所有文件范围声明都包含
inline函数说明符extern,则该转换单元中的定义是内联定义.内联定义不提供函数的外部定义,也不禁止另一个转换单元中的外部定义.内联定义提供了外部定义的替代,翻译器可以使用该定义在同一翻译单元中实现对该功能的任何调用.未指定对函数的调用是使用内联定义还是使用外部定义.
如果我理解了这一切,inline那么如果还有一个具有相同名称的外部函数,那么具有上例中定义的函数的编译单元只会一致地编译,而且我永远不知道我自己的函数或外部函数是否被调用.
这种行为不是完全愚蠢吗?在inline没有static或extern在C99中定义函数是否有用?我错过了什么吗?
当然我错过了什么,行为并不愚蠢.:)
正如Nemo所解释的那样,我们的想法是定义函数
inline void f() {}
Run Code Online (Sandbox Code Playgroud)
在头文件中只有一个声明
extern inline void f();
Run Code Online (Sandbox Code Playgroud)
在相应的.c文件中.只有extern声明才会触发生成外部可见的二进制代码.确实没有inline在.c文件中使用 - 它只在标题中有用.
正如Jonathan的回答中引用的C99委员会的基本原理所阐述的那样,inline所有关于编译器优化都需要在调用的站点上看到函数的定义.这只能通过将标题放在标题中来实现,当然,标题中的定义在编译器每次看到它时都不能发出代码.但由于编译器不是强制实际内联函数,因此必须在某处存在外部定义.
考虑以下内联函数:
// Inline specifier version
#include<iostream>
#include<cstdlib>
inline int f(const int x);
inline int f(const int x)
{
return 2*x;
}
int main(int argc, char* argv[])
{
return f(std::atoi(argv[1]));
}
Run Code Online (Sandbox Code Playgroud)
和constexpr等效版本:
// Constexpr specifier version
#include<iostream>
#include<cstdlib>
constexpr int f(const int x);
constexpr int f(const int x)
{
return 2*x;
}
int main(int argc, char* argv[])
{
return f(std::atoi(argv[1]));
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:说明constexpr符是否意味着说明inline符,如果一个非常量参数传递给一个constexpr函数,编译器将尝试inline该函数,就像说明inline符被放入其声明一样?
C++ 11标准能保证吗?
我相信,inline已经过时,因为我在这里读到:
无论你如何指定一个函数
inline,它都是一个允许编译器忽略的请求:编译器可能内联扩展一些,全部或没有你调用指定函数的地方inline.
然而,Angew似乎理解我不知道的事情.在这个问题中他和我来回走了很多,关于是否inline仍然有用.
这个问题不是一个问题:
inline或在哪里inline仍可用于向编译器提示inline功能:我应该何时为函数/方法编写关键字'inline'?.inline运行代码:强制其他翻译单元中的内联函数请记住,编译器可以随意使用inline,因此inline在那里没有用处:可以inline用来强制而不是建议编译代码的更改?
我是一名试图学习C++的JAVA开发人员,但我真的不知道标准函数声明的最佳实践是什么.
在课堂里:
class Clazz
{
public:
void Fun1()
{
//do something
}
}
Run Code Online (Sandbox Code Playgroud)
或者在外面:
class Clazz
{
public:
void Fun1();
}
Clazz::Fun1(){
// Do something
}
Run Code Online (Sandbox Code Playgroud)
我觉得第二个可读性较差......
// this e works
document.getElementById("p").oncontextmenu = function(e) {
e = e || window.event;
var target = e.target || e.srcElement;
console.log(target);
};
// this e is undefined
function doSomething(e) {
e = e || window.event;
var target = e.target || e.srcElement;
console.log(target);
}
Run Code Online (Sandbox Code Playgroud)
<p id="p" onclick="doSomething(e)">
<a href="#">foo</a>
<span>bar</span>
</p>
Run Code Online (Sandbox Code Playgroud)
有人问过一些类似的问题.
但在我的代码中,我正在尝试获取被点击的子元素,例如a或span.
那么event作为参数传递给事件处理程序的正确方法是什么,或者如何在不传递参数的情况下在处理程序中获取事件?
我知道addEventListener并且jQuery,请提供一个将事件传递给inline事件处理者的解决方案.