【问题标题】:About the null-terminated strings (confused)关于以 null 结尾的字符串(困惑)
【发布时间】:2013-02-05 21:23:10
【问题描述】:

下面的着色器被称为一个字符串和一个以 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')

【问题讨论】:

  • Save yourself some typing 在这些着色器上。
  • 您已将其标记为 C 和 C++。是哪一个?
  • @abarnert:两者都可以,因为在这种情况下两者都遵循相同的规则。
  • @NicolBolas:但是 OP 不知道规则是什么,因此无法知道他是否正在处理规则相同、非常相似或完全不同的案例——但是他大概确实知道他是在写 C 还是 C++。而且,即使在这种情况下,知道引用 C 标准还是 C++ 标准也会很有帮助。

标签: c++ c


【解决方案1】:

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

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

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

连续的字符串文字被折叠成一个单独的文字。所以"ab" "c" 变成了"abc"

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

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

【讨论】:

    【解决方案2】:

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

    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 字符。也就是说,字符串文字总是给你一个以 null 结尾的字符串。

    【讨论】:

      【解决方案3】:

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

      是续行,这里是多余的。

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

      来自String Literals的C99标准部分:

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

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

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

      来自 C99 标准的同一部分:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        "abc" "xyz" 
        

        等价于字符串"abcxyz"

        【讨论】:

          【解决方案5】:
          1. 表示转义后面的字符,在这种情况下看起来是换行符;我认为这里没有必要/无关紧要。
          2. 它只是一个字符串 - 调用 printf(VertexShader[0]) 试试。
          3. 当您声明一个 C 字符串时,会自动附加一个 \0。您无需手动指定,事实上,如果您这样做了,我相信您会得到两个 \0。

          【讨论】:

            【解决方案6】:

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

            例子

             "hello" \
             " world"
            

            相同
            "hello" " world"
            

            顺便说一句,和

            "hello world"
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多