当我使用gcc编译一个非常简单的源文件时,我不必指定标准包含文件的路径,例如stdio或stdlib.
GCC如何知道如何找到这些文件?
它是否在/usr/include
内部硬连线,或者它将从其他OS组件获取路径?
所以我正在阅读橙皮书(第3版),我在第9章中看到了一个关于不变限定符的段落.它说:
该不变预选赛指示编译器和链接忽略的表达和功能没有直接关系到输出的计算.
这段经文是在两段相似的代码片段之后发布的:
uniform mat4 MVPmatrix;
// ...
in vec4 MCVertex;
// ...
a(); // does not modify gl_Position, MVP or MCVertex
// ...
// Transform vertex to clip space
gl_Position = MVP * MCVertex;
Run Code Online (Sandbox Code Playgroud)
和
uniform mat4 MVPmatrix;
// ...
invariant gl_Position;
in vec4 MCVertex;
// ...
a(); // does not modify gl_Position, MVP or MCVertex
// ...
// Transform vertex to clip space
gl_Position = MVP * MCVertex;
Run Code Online (Sandbox Code Playgroud)
然后这本书继续指出:
无论什么不相关的函数或表达式链接到着色器,第一种情况可以或可以不以完全相同的方式计算变换的位置.如果使用多遍算法多次渲染相同的几何体,这可能会导致渲染问题.
哪个让我困惑.如果a()
决不影响计算变换位置所涉及的变量,那么计算将如何变化?(以及如何添加invariant
帮助呢?).并且参考第一个引用,他们究竟是什么意思"忽略不相关的功能"?他们只是没有被处决?
在以下c ++文本上运行pygments默认lexer :,class foo{};
结果如下:
(Token.Keyword, 'class')
(Token.Text, ' ')
(Token.Name.Class, 'foo')
(Token.Punctuation, '{')
(Token.Punctuation, '}')
(Token.Punctuation, ';')
Run Code Online (Sandbox Code Playgroud)
请注意,toke foo
具有类型Token.Name.Class
.
如果我将类名更改为foobar
我希望能够仅在触摸的标记上运行默认词法分析器,在这种情况下是原始标记foo
和{
.
问:如何保存词法分析器状态,以便标记化foobar{
将为类型提供令牌Token.Name.Class
?
具有此功能将优化语法突出显示,例如,在文件中间正在进行更改(用户正在键入文本)的大型源文件.似乎没有记录的方法这样做,也没有关于如何使用默认pygments词法分析器的信息.
是否有任何其他语法突出显示系统支持此行为?
编辑:
关于性能,这里有一个例子:http://tpcg.io/ESYjiF
我正在寻找答案,但我找不到任何相关的信息.我们举个例子:
class MyClass
{
//member functions and variables
};
void foo(int pivot,...)
{
va_list arguments;
va_start(arguments,pivot);
//va_arg(arguments,???)
va_end(arguments);
}
void bar()
{
MyClass a;
MyClass * b = &a;
const MyClass & c = a;
foo(0,a,b,c);
}
Run Code Online (Sandbox Code Playgroud)
争论如何a
,b
并c
通过?通过价值或参考以及如何使用va_arg来询问它们?那么MyClass的构造函数/析构函数呢?在c ++标准中指定了哪种行为?