1

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

着色器:

const GLchar* VertexShader =
{
    "#version 330\n"\

    "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. shader中有几个字符串,为什么说shader只有一个字符串?
  3. 为什么说它是一个以空字符结尾的字符串?(因为没有'\0')
4

6 回答 6

6

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

续行,表示当前行在下一行继续。

shader中有几个字符串,为什么说shader只有一个字符串?

连续的字符串文字被折叠成一个。就这样"ab" "c"变成了"abc"

为什么说它是一个以空字符结尾的字符串?(因为没有'\0')

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

于 2013-02-05T21:25:58.833 回答
4

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

const GLchar* VertexShader =
{
  "#version 330\n" "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因为它\0在末尾添加了一个字符。也就是说,字符串文字总是给你一个以空值结尾的字符串。

于 2013-02-05T21:28:04.763 回答
2

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

它是一个行继续,在这里是多余的。

shader中有几个字符串,为什么说shader只有一个字符串?

来自String Literals的 C99 标准部分:

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

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

为什么说它是一个以空字符结尾的字符串?(因为没有'\0')

来自 C99 标准的同一部分:

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

一个空字符被添加到每个字符串文字(在连接之后)。

于 2013-02-05T21:27:36.320 回答
1

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

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

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

"abc" "xyz" 

相当于字符串"abcxyz"

于 2013-02-05T21:25:51.620 回答
1
  1. 表示转义以下字符,在这种情况下看起来是换行符;我认为这在这里是不必要的/无关的。
  2. 它只是一个字符串 - 调用 printf(VertexShader[0]) 来尝试。
  3. 当您声明一个 C 字符串时,会自动附加一个 \0。你没有手动指定这个,事实上如果你这样做了,我相信你会得到两个 \0 。
于 2013-02-05T21:26:05.090 回答
1

反斜杠吃掉紧随其后的行尾字符。

例子

 "hello" \
 " world"

是相同的

"hello" " world"

顺便说一句,这与

"hello world"
于 2013-02-05T21:26:33.070 回答