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

时间:2013-02-05 21:23:10

标签: c++ c

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

着色器:

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. 着色器中有几个字符串,为什么着色器只有一个字符串?
  3. 为什么它被称为以空字符结尾的字符串? (因为没有'\ 0')

6 个答案:

答案 0 :(得分:6)

  

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

这是一个续行,它意味着当前行继续在下一行。

  

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

顺序字符串文字折叠为单个字符串文字。因此"ab" "c"变为"abc"

  

为什么它被称为以空字符结尾的字符串? (因为没有'\ 0')

字符串文字以空值终止。所以"ab"实际上是{'a', 'b', '\0'}。请注意,折叠字符串文字时,将删除除最后一个隐式空终止字符之外的所有字符。

答案 1 :(得分: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字符。也就是说,字符串文字总是为您提供以空字符结尾的字符串。

答案 2 :(得分:2)

  

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

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

  

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

来自 String Literals 的C99标准部分:

  

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

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

  

为什么它被称为以空字符结尾的字符串? (因为没有'\ 0')

来自C99标准的同一部分:

  

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

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

答案 3 :(得分: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"

答案 4 :(得分:1)

  1. 意味着转义以下字符,在这种情况下看起来是换行符;我认为这在这里是不必要/无关的。
  2. 这只是一个字符串 - 调用printf(VertexShader [0])来试试。
  3. 声明C字符串时会自动追加\ 0。你没有手动指定,事实上,如果你这样做,你会得到两个\ 0我相信。

答案 5 :(得分:1)

反斜杠使用紧随其后的行尾字符。

实施例

 "hello" \
 " world"

相同
"hello" " world"

相同
"hello world"