1

次のシェーダーは、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. シェーダーにはいくつかの文字列がありますが、なぜシェーダーには1つの文字列しかないと言われているのですか?
  3. なぜそれはnullで終了する文字列であると言われるのですか?('\ 0'がないので)
4

6 に答える 6

6

各行の終わりにあるスラッシュはどういう意味ですか?さらに、なぜ最後の行にスラッシュがないのですか?

これは行の継続であり、現在の行が次の行に続くことを意味します。

シェーダーにはいくつかの文字列がありますが、なぜシェーダーには1つの文字列しかないと言われているのですか?

順次文字列リテラルは1つにまとめられます。だから"ab" "c"になり"abc"ます。

なぜそれはnullで終了する文字列であると言われるのですか?('\ 0'がないので)

文字列リテラルはnullで終了します。だから"ab"実際には{'a', 'b', '\0'}。文字列リテラルが折りたたまれている場合、最後の暗黙のnull終了文字を除くすべてが削除されることに注意してください。

于 2013-02-05T21:25:58.833 に答える
4

バックスラッシュ(\)の後に改行がある場合は常に、それらの文字が削除され、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文字列リテラルは、最後に文字を追加するため、文字列リテラルよりも1文字大きい配列を常に提供します\0。つまり、文字列リテラルは常にnullで終了する文字列を提供します。

于 2013-02-05T21:28:04.763 に答える
2

各行の終わりにあるスラッシュはどういう意味ですか?さらに、なぜ最後の行にスラッシュがないのですか?

これは線の続きであり、ここでは不要です。

シェーダーにはいくつかの文字列がありますが、なぜシェーダーには1つの文字列しかないと言われているのですか?

文字列リテラルに関するC99標準セクションから:

変換フェーズ6では、隣接する文字の任意のシーケンスとワイド文字列リテラルトークンによって指定されたマルチバイト文字シーケンスが、単一のマルチバイト文字シーケンスに連結されます。トークンのいずれかがワイド文字列リテラルトークンである場合、結果のマルチバイト文字シーケンスはワイド文字列リテラルとして扱われます。それ以外の場合は、文字列リテラルとして扱われます。

投稿されたコードの文字列リテラルは、単一の文字列リテラルに連結されます。

なぜそれはnullで終了する文字列であると言われるのですか?('\ 0'がないので)

C99標準の同じセクションから:

変換フェーズ7では、値ゼロのバイトまたはコードが、1つまたは複数の文字列リテラルから生じる各マルチバイト文字シーケンスに追加されます。

ヌル文字が各文字列リテラルに追加されます(連結後)。

于 2013-02-05T21:27:36.320 に答える
1

スラッシュは行継続記号です。これは、行が1行に連結されていることを意味します。読みやすくするためにそのように書かれています。代わりにあなたが持っていたと想像してください

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

文字列リテラルは次々に書き込まれるときに自動的に連結されるため、文字列は1つだけです。

"abc" "xyz" 

文字列と同等"abcxyz"です。

于 2013-02-05T21:25:51.620 に答える
1
  1. 次の文字をエスケープすることを意味します。この場合は改行のように見えます。ここではこれは不要/無関係だと思います。
  2. これは1つの文字列です。printf(VertexShader [0])を呼び出して試してください。
  3. C文字列を宣言すると、\0が自動的に追加されます。これを手動で指定することはありません。実際、指定すると2つの\0が得られると思います。
于 2013-02-05T21:26:05.090 に答える
1

バックスラッシュは、行末文字の直後を食べます。

 "hello" \
 " world"

と同じです

"hello" " world"

ちなみにこれは

"hello world"
于 2013-02-05T21:26:33.070 に答える