我正在努力学习C.通过阅读一些代码,我遇到了这样的一行:
__inline__ void () ...
Run Code Online (Sandbox Code Playgroud)
什么__inline__意思?如何将这个词放在函数前面使它与众不同?
在搜索到SO之后,一个问题告诉我,内联友元函数的词法范围是它定义的类,这意味着它可以访问例如typedef类中的s而不限定它们.但后来我想知道这种功能的实际范围是什么?海湾合作委员会至少拒绝我所有打电话的尝试.可以通过除ADL以外的方式调用示例中的函数,由于没有参数,这是不可能的吗?
标准报价表示赞赏,因为我目前无法访问我的副本.
namespace foo{
struct bar{
friend void baz(){}
void call_friend();
};
}
int main(){
foo::baz(); // can't access through enclosing scope of the class
foo::bar::baz(); // can't access through class scope
}
namespace foo{
void bar::call_friend(){
baz(); // can't access through member function
}
}
Run Code Online (Sandbox Code Playgroud)
导致这些错误:
prog.cpp: In function ‘int main()’:
prog.cpp:9: error: ‘baz’ is not a member of ‘foo’
prog.cpp:10: error: ‘baz’ is not a member of ‘foo::bar’
prog.cpp: In member …Run Code Online (Sandbox Code Playgroud) 我想了解当CSS所在的元素是CSS的元素的display:blockDOM子元素时会发生什么display:inline(因此块元素是内联元素的子元素).
CSS 2.1规范的匿名块框部分描述了这种情况:该示例包括以下规则......
body { display: inline }
p { display: block }
Run Code Online (Sandbox Code Playgroud)
......以及附带的文字说......
BODY元素包含匿名文本的块(C1),后跟块级元素,后跟另一个匿名文本块(C2).生成的框将是BODY周围的匿名块框,包含C1周围的匿名块框,P块框和C2周围的另一个匿名块框.
如果你有一个display:inline父元素,并且如果这个父元素有一个子元素,那么这个子元素display:block的存在似乎使得父元素几乎表现得像display:block,并忽略它被定义为的事实(因为父元素display:inline现在只包含匿名元素)和非匿名阻止子,即它不再包含任何内联子项)?
我的问题是,在这种情况下(有display:block孩子的地方)那么父母的定义之间有什么区别display:inline而不是display:block?
编辑:我更了解CSS 2.1标准,而不是各种浏览器实现在实践中的表现.
第二编辑:
规范中有一个区别.在下面的文档中,第二个"块"段的边框围绕整个段落和页面的整个宽度; 而第一个'内联段落的边框是在段落内的每一行(即使有多行),并且不超过每行的确切宽度(每行比页面宽度短).
<html>
<head>
<style type="text/css">
p.one
{
border-style:solid;
border-width:1px;
display: inline;
}
p.two
{
border-style:solid;
border-width:1px;
}
</style>
</head>
<body>
<p class="one">Some text. <b>Note:</b> The "border-width"
property does not work if it is used alone. Use the …Run Code Online (Sandbox Code Playgroud) 在编译C++代码时,GCC是否会尝试通过选择未标记inline关键字的内联函数来优化速度?
假设我有两个.cpp文件file1.cpp和file2.cpp:
// file1.cpp
#include <iostream>
inline void foo()
{
std::cout << "f1\n";
}
void f1()
{
foo();
}
Run Code Online (Sandbox Code Playgroud)
和
// file2.cpp
#include <iostream>
inline void foo()
{
std::cout << "f2\n";
}
void f2()
{
foo();
}
Run Code Online (Sandbox Code Playgroud)
在main.cpp我已经向前宣布f1()和f2():
void f1();
void f2();
int main()
{
f1();
f2();
}
Run Code Online (Sandbox Code Playgroud)
结果(不依赖于构建,调试/发布版本的结果相同):
f1
f1
Run Code Online (Sandbox Code Playgroud)
哇:编译器以某种方式仅选择定义file1.cpp并在其中使用它f2().这种行为的确切解释是什么?
注意,改变inline到static是这个问题的解决方案.将内联定义放在未命名的命名空间中也可以解决问题并且程序打印:
f1
f2
Run Code Online (Sandbox Code Playgroud) 做什么static,extern并且inline(和它们的组合)使用LLVM编译器Objetive-C是什么意思?
另外,我注意到有CG_EXTERN和CG_INLINE宏.我们应该使用那些吗?
(我找不到一个有明确解释的来源,所以我认为在这里创建一个可能有用,或者如果有人知道它可能会指向它)
我正在尝试使用特定类的内联成员函数.例如,没有内联的函数声明和实现是这样的:
在头文件中:
int GetTplLSize();
Run Code Online (Sandbox Code Playgroud)
在.cpp文件中:
int NeedleUSsim::GetTplLSize()
{
return sampleDim[1];
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,如果我将"inline"关键字放在实现和声明中的任何一个中,以及两个地方,我都会收到链接器错误,如下所示:
Creating library C:\DOCUME~1\STANLEY\LOCALS~1\TEMP\MEX_HN~1\templib.x and object C:\DOCUME~1\STANLEY\LOCALS~1\TEMP\MEX_HN~1\templib.exp mexfunction.obj : error LNK2019: unresolved external symbol "public: int __thiscall NeedleUSsim::GetTplLSize(void)" (?GetTplLSize@NeedleUSsim@@QAEHXZ) referenced in function _mexFunction mexfunction.mexw32 : fatal error LNK1120: 1 unresolved externals C:\PROGRA~1\MATLAB\R2008B\BIN\MEX.PL: Error: Link of 'mexfunction.mexw32' failed.
为了摆脱这个错误需要做什么(即在制作这些内联成员函数方面我做错了什么)?
使用新的C++ 11标准,何时应该在inline关键字上使用constexpr关键字?constexpr关键字是否提供任何额外的优化inline,或仅仅断言必须在编译时计算事物?
为什么constexpr在调用不稳定的某些情况下在GCC 上工作,例如调用foo(x)非constexpr变量?这是GCC中的错误还是它实际上是标准的一部分?
我想我之前已经问过我的问题了,我确实读了它们但仍然很少混淆,因此要求说清楚.
The C++ standard says all member functions defined inside class definition are inline
我也听说编译器可以忽略函数的内联.在上述情况下是否会成立,或者如果在类定义中定义,它将始终内联?
此外,这个设计背后的原因是什么,使所有函数在类定义中内联定义?内联与源文件和头文件有什么关系?
更新:所以如果不进行内联,应该总是在课外定义它们的功能,对吧?
JohnB的更新2: 在类定义中声明的两个函数永远不能互相调用,因为它们必须包含另一个函数的整个主体.在这种情况下会发生什么?(已由Emilio Garavaglia回答)
我目前正在Haskell中编写一个多模块程序.我发现了一个奇怪的问题,我的文件没有正确优化,即使我正在传入-O2等等.有问题的文件是共享的3D矢量数学模块.当单独编译为.o时,这些模块已正确优化.当使用--make编译为较大程序的一部分时,它们未正确优化.核心是完全不同的.
我在vector.hs文件中添加了一些简单的精简测试代码:
data TestVector = TestVector !Double !Double !Double !Double
addVec :: TestVector -> TestVector -> TestVector
addVec (TestVector x1 y1 z1 w1) (TestVector x2 y2 z2 w2) =
TestVector (x1 + x2) (y1 + y2) (z1 + z2) (w1 + w2)
Run Code Online (Sandbox Code Playgroud)
并从主要进口...
import Vector
Run Code Online (Sandbox Code Playgroud)
这个代码的编译方式与独立的.hs文件不同,而不是在构建main.hs时使用 --make
我的命令行是:
ghc -tmpdir tmp -hidir hi -odir obj -fext-core -fexcess-precision -funbox-strict-fields -threaded -rtsopts -fwarn-missing-signatures -Wall -O2 Main.hs -o main
Run Code Online (Sandbox Code Playgroud)
干杯