标签: inline

将内联关键字与模板一起使用是否有意义?

由于模板是在头文件中定义的,编译器能够确定内联函数是否有利,它是否有意义?我听说现代编译器更好地知道何时内联函数并忽略inline提示.


编辑:我想接受这两个答案,但这是不可能的.为了解决这个问题,我接受了菲涅耳的回答,因为它收到了大多数选票并且他是正式的,但正如我在评论中所提到的,我从不同的角度考虑Puppy组件10的答案也是正确的. .

问题出在C++语义中,在inline关键字和内联的情况下并不严格.Phresnel说"如果你的意思是写内联",但实际意义inline并不明确,因为它从原来的意义演变为"阻止编译人员讨论ODR违规"的指令,正如Puppy所说.

c++ templates inline

110
推荐指数
3
解决办法
6万
查看次数

为什么标题中的C++内联函数?

注意:这不是关于如何使用内联函数或它们如何工作的问题,更多的是为什么它们按照它们的方式完成.

类成员函数的声明不需要定义函数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)

c++ theory language-design inline c++-faq

109
推荐指数
7
解决办法
9万
查看次数

内联函数与预处理器宏

内联函数与预处理器宏有何不同?

c c++ macros inline

107
推荐指数
6
解决办法
8万
查看次数

在电子邮件中发送内联图片

通过电子邮件将图像作为嵌入图像发送到正文中时出现问题.图像文件显示为附件,但是内嵌图像部分显示为红色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)

c# email smtp inline image

95
推荐指数
7
解决办法
17万
查看次数

如何使用javascript擦除所有内联样式并仅保留css样式表中指定的样式?

如果我的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样式表指定的样式?

javascript css jquery inline

92
推荐指数
3
解决办法
10万
查看次数

没有"静态"或"外部"的"内联"在C99中是否有用?

当我尝试构建此代码时

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 inlineextern inline代替just inline,或者如果我使用-O(因此函数实际内联),则错误消失.

这种行为似乎在C99标准第6.7.4(6)段中定义:

如果转换单元中函数的所有文件范围声明都包含inline函数说明符extern,则该转换单元中的定义是内联定义.内联定义不提供函数的外部定义,也不禁止另一个转换单元中的外部定义.内联定义提供了外部定义的替代,翻译器可以使用该定义在同一翻译单元中实现对该功能的任何调用.未指定对函数的调用是使用内联定义还是使用外部定义.

如果我理解了这一切,inline那么如果还有一个具有相同名称的外部函数,那么具有上例中定义的函数的编译单元只会一致地编译,而且我永远不知道我自己的函数或外部函数是否被调用.

这种行为不是完全愚蠢吗?在inline没有staticextern在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所有关于编译器优化都需要在调用的站点上看到函数的定义.这只能通过将标题放在标题中来实现,当然,标题中的定义在编译器每次看到它时都不能发出代码.但由于编译器不是强制实际内联函数,因此必须在某处存在外部定义.

c inline c99

91
推荐指数
2
解决办法
3万
查看次数

constexpr是否意味着内联?

考虑以下内联函数:

// 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标准能保证吗?

c++ inline standards-compliance constexpr c++11

89
推荐指数
2
解决办法
2万
查看次数

内联仍然有用吗?

我相信,inline已经过时,因为我在这里读到:

无论你如何指定一个函数inline,它都是一个允许编译器忽略的请求:编译器可能内联扩展一些,全部或没有你调用指定函数的地方inline.

然而,Angew似乎理解我不知道的事情.在这个问题中他和我来回走了很多,关于是否inline仍然有用.

这个问题不是一个问题:

请记住,编译器可以随意使用inline,因此inline在那里没有用处:可以inline用来强制而不是建议编译代码的更改?

c++ methods inline function deprecated

85
推荐指数
2
解决办法
2万
查看次数

类内外的函数声明

我是一名试图学习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)

我觉得第二个可读性较差......

c++ inline

83
推荐指数
4
解决办法
8万
查看次数

如何将事件作为参数传递给JavaScript中的内联事件处理程序?

// 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)

有人问过一些类似的问题.

但在我的代码中,我正在尝试获取被点击的子元素,例如aspan.

那么event作为参数传递给事件处理程序的正确方法是什么,或者如何在不传递参数的情况下在处理程序中获取事件?

编辑

我知道addEventListener并且jQuery,请提供一个将事件传递给inline事件处理者的解决方案.

javascript events inline argument-passing

83
推荐指数
3
解决办法
12万
查看次数