タグ付けされた質問 「string-literals」

文字列リテラルは、CおよびC ++でのリテラル定数文字列の構文表現に関係します。


10
C ++複数行文字列リテラル
PerlのようなC ++で複数行のプレーンテキストの定数リテラルを作成する方法はありますか?たぶん#include、ファイルを解析する際の解析トリックですか?私はそれを考えることができませんが、男の子、それはいいでしょう。C ++ 0xになることは知っています。



8
文字列リテラル:どこに行くのですか?
文字列リテラルが割り当てられる/格納される場所に興味があります。 ここで興味深い答えが1つ見つかりました。 インラインで文字列を定義すると、実際にはプログラム自体にデータが埋め込まれ、変更できません(一部のコンパイラではこれをスマートトリックで許可しているので、気にしないでください)。 しかし、それはC ++に関係していることは言うまでもありません。 気になります。= D だから私の質問は私の文字列リテラルがどこにどのように保持されるのですか?それを変更しようとしないのはなぜですか?実装はプラットフォームによって異なりますか?「スマートトリック」について詳しく説明する人はいますか?

5
PythonでのWindowsパス
たとえば、Windowsディレクトリを表す最良の方法は何"C:\meshes\as"ですか?スクリプトを変更しようとしていましたが、ディレクトリを正しく取得できないように見えるため、'\'機能しません。エスケープ文字として機能しているためと思いますか?

6
コンパイル時のC文字列の長さの計算。これは本当にconstexprですか?
コンパイル時に文字列リテラルの長さを計算しようとしています。これを行うには、次のコードを使用しています。 #include <cstdio> int constexpr length(const char* str) { return *str ? 1 + length(str + 1) : 0; } int main() { printf("%d %d", length("abcd"), length("abcdefgh")); } すべてが期待どおりに機能し、プログラムは4と8を出力します。clangによって生成されたアセンブリコードは、結果がコンパイル時に計算されることを示しています。 0x100000f5e: leaq 0x35(%rip), %rdi ; "%d %d" 0x100000f65: movl $0x4, %esi 0x100000f6a: movl $0x8, %edx 0x100000f6f: xorl %eax, %eax 0x100000f71: callq …

4
一部のコンパイラーが同一の文字列リテラルに同じアドレスを使用するのはなぜですか?
https://godbolt.org/z/cyBiWY 'some'MSVCによって生成されたアセンブラコードで2つのリテラルを確認できますが、clangとgccを使用するリテラルは1つだけです。これにより、コード実行の結果がまったく異なります。 static const char *A = "some"; static const char *B = "some"; void f() { if (A == B) { throw "Hello, string merging!"; } } 誰かがそれらのコンパイル出力の違いと類似点を説明できますか?最適化が要求されていないのに、clang / gccが何かを最適化するのはなぜですか?これはある種の未定義の動作ですか? また、宣言を以下に示すように変更すると、clang / gcc / msvcはアセンブラー"some"コードに何も残さないことに気づきました。なぜ動作が異なるのですか? static const char A[] = "some"; static const char B[] = "some";

4
マクロ引数を文字列リテラルとして使用するにはどうすればよいですか?
変数名の文字列リテラル表現と変数自体の両方を関数に渡すマクロを作成する方法を理解しようとしています。 たとえば、次の関数が与えられます。 void do_something(string name, int val) { cout << name << ": " << val << endl; } これを実行できるように、マクロを作成したいと思います。 int my_val = 5; CALL_DO_SOMETHING(my_val); どちらが印刷されますか: my_val: 5 私は次のことを試みました: #define CALL_DO_SOMETHING(VAR) do_something("VAR", VAR); ただし、ご想像のとおり、引用符内のVARは置き換えられず、文字列リテラル「VAR」として渡されるだけです。したがって、マクロ引数を文字列リテラル自体に変換する方法があるかどうかを知りたいと思います。

1
C ++ 11での文字列リテラルのUnicodeエンコーディング
関連する質問に続いて、C ++ 11の新しい文字と文字列リテラルタイプについて質問したいと思います。現在、4種類の文字と5種類の文字列リテラルがあるようです。文字タイプ: char a = '\x30'; // character, no semantics wchar_t b = L'\xFFEF'; // wide character, no semantics char16_t c = u'\u00F6'; // 16-bit, assumed UTF16? char32_t d = U'\U0010FFFF'; // 32-bit, assumed UCS-4 そして文字列リテラル: char A[] = "Hello\x0A"; // byte string, "narrow encoding" wchar_t B[] = L"Hell\xF6\x0A"; …

9
Cでの文字列リテラルの「ライフタイム」
次の関数によって返されるポインタにアクセスできませんか? char *foo(int rc) { switch (rc) { case 1: return("one"); case 2: return("two"); default: return("whatever"); } } つまり、C / C ++のローカル変数の存続期間は、実際には関数内だけですよね?つまり、char* foo(int)終了した後、それが返すポインタはもはや何も意味しませんよね? ローカル変数の存続期間について少し混乱しています。良い説明は何ですか?



4
文字配列を文字列として使用するにはどうすればよいですか?
Cの文字列は単なる文字配列であることを理解しています。そこで、次のコードを試しましたが、ガベージ出力やプログラムのクラッシュなど、奇妙な結果が得られました。 #include <stdio.h> int main (void) { char str [5] = "hello"; puts(str); } なぜこれが機能しないのですか? できれいにコンパイルされますgcc -std=c17 -pedantic-errors -Wall -Wextra。 注:この投稿は、文字列を宣言するときにNULターミネーター用のスペースを割り当てられなかったことから生じる問題の標準的なFAQとして使用することを目的としています。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.