关于以null结尾的字符串(混淆)

About the null-terminated strings (confused)

本文关键字:字符串 混淆 结尾 null      更新时间:2023-10-16

下面的着色器被称为一个字符串和一个以null结尾的字符串。

着色器:

const GLchar* VertexShader =
{
    "#version 330n"
    "layout(location=0) in vec4 in_Position;n"
    "layout(location=1) in vec4 in_Color;n"
    "out vec4 ex_Color;n"
    "void main(void)n"
    "{n"
    "   gl_Position = in_Position;n"
    "   ex_Color = in_Color;n"
    "}n"
};

我的问题是:

  1. 每行末尾的斜线是什么意思?此外,为什么最后一行没有斜线
  2. 着色器中有几个字符串,为什么说着色器只有一个字符串
  3. 为什么说它是一个以null结尾的字符串?(由于没有"\0")

每行末尾的斜线是什么意思?此外,为什么最后一行没有斜线?

这是一条线路的延续,意味着当前线路在下一条线路中延续。

着色器中有几个字符串,为什么说着色器只有一个字符串?

顺序字符串文字被折叠成一个单独的文字。因此"ab" "c"变成"abc"

为什么说它是一个以null结尾的字符串?(由于没有"\0")

字符串文字以null结尾。所以"ab"实际上就是{'a', 'b', ''}。请注意,当字符串文字被折叠时,除了最后一个隐式null终止字符外,其他所有字符都将被删除。

每当有一个反斜杠()后面跟着一行新行时,这些字符就会被删除,将这两行拼接在一起。这种情况发生在翻译的早期阶段,甚至在执行预处理指令之前。这就为您提供了物理源线和逻辑源线之间的区别。从逻辑上讲,该代码等效于以下内容:

const GLchar* VertexShader =
{
  "#version 330n" "layout(location=0) in vec4 in_Position;n" "layout(location=1) in vec4 in_Color;n" "out vec4 ex_Color;n"
  "void main(void)n" "{n" "   gl_Position = in_Position;n" "   ex_Color = in_Color;n" "}n"
};

然而,这种线路拼接在这里是完全没有必要的。

稍后在翻译阶段(在执行预处理指令之后),任何相邻的字符串文字标记都会被连接起来。也就是说,它们被连接起来,就好像它们只是一个字符串文字。上面代码中的所有字符串文字都将被连接起来(即使新行将它们分隔开)。

字符串文字总是为您提供一个比字符串文字大一个字符的const char数组,因为它在末尾添加了一个字符。也就是说,字符串文字总是给你一个以null结尾的字符串。

每行末尾的斜线是什么意思?此外,为什么最后一行没有斜线?

这是一条线的延续,在这里是多余的。

着色器中有几个字符串,为什么说着色器只有一个字符串?

来自字符串文字的C99标准部分:

在翻译阶段6中,由相邻字符和宽字符串文字标记的任何序列指定的多字节字符序列被连接成单个多字节字符串如果任何标记都是宽字符串文字标记,则生成的多字节字符序列将被视为宽字符串文字;否则,它将被视为字符串文字。

已发布代码中的字符串文字被连接到单个字符串文字中。

为什么说它是一个以null结尾的字符串?(由于没有"\0")

来自C99标准的同一部分:

在翻译阶段7,值为零的字节或代码被附加到由字符串文字或文字产生的每个多字节字符序列

每个字符串文字中都会添加一个空字符(串联后)。

斜线是换行符。这只是意味着这些行被连接在一行中。为了可读性,它是这样写的。想象一下你有

"layout(location=0) in vec4 in_Position;n" "layout(location=1) in vec4 in_Color;n" "out vec4 ex_Color;n"

只有一个字符串,因为字符串文字在一个接一个地写入时会自动连接:

"abc" "xyz" 

相当于字符串CCD_ 8。

  1. 表示对以下字符进行转义,在本例中该字符看起来是换行符;我认为这是多余的
  2. 它只是一个字符串-调用printf(VertexShader[0])进行尝试
  3. 当您声明一个C字符串时,会自动追加\0。你没有手动指定,事实上,如果你指定了,我相信你会得到两个\0

反斜杠吃掉紧接在后面的行尾字符。

示例

 "hello" 
 " world"

与相同

"hello" " world"

顺便说一句,它与相同

"hello world"