Questions tagged «string-literals»

字符串文字涉及C和C ++中文字常量字符串的语法表示形式。


10
C ++多行字符串文字
有什么方法可以在C ++中使用Perl编写多行纯文本,常量文字?也许解析#include文件有一些技巧?我想不出一个,但是男孩,那太好了。我知道它将用C ++ 0x。



8
字符串文字:它们去哪里了?
我对字符串文字在哪里分配/存储感兴趣。 我在这里确实找到了一个有趣的答案,说: 内联定义字符串实际上是将数据嵌入程序本身,并且不能更改(某些编译器通过巧妙的技巧允许这样做,不要打扰)。 但是,它与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生成的汇编代码中看到两个文字,但是只有一个带有clang和gcc。这导致代码执行的结果完全不同。 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中新的字符和字符串文字类型。看来我们现在有四种字符和五种字符串文字。字符类型: 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)终止后返回的指针不再意味着什么,对吗? 我对局部变量的生存期感到困惑。什么是好的澄清?

2
C ++ 11的原始字符串文字R“(…)”中括号的基本原理是什么?
C ++ 11中引入了一个非常方便的功能,称为原始字符串文字,即没有转义字符的字符串。而不是这样写: regex mask("\\t[0-9]+\\.[0-9]+\\t\\\\SUB"); 您可以简单地这样写: regex mask(R"(\t[0-9]+\.[0-9]+\t\\SUB)"); 更具可读性。但是,请注意,必须在字符串周围附加括号以定义原始字符串文字。 我的问题是,为什么我们甚至需要这些?对我来说,这看起来很丑陋且不合逻辑。这是我所看到的缺点: 额外的冗长性,而整个功能则使文字更加紧凑 难以区分文字的正文和定义的符号 我的意思是硬区分: "good old usual string literal" ^- body inside quotes -^ R"(new strange raw string literal)" ^- body inside parenthesis -^ 这是专业人士: 更大的灵活性,原始字符串中提供了更多字符,尤其是与定界符一起使用时: "delim( can use "()" here )delim" 但是,如果您需要更大的灵活性,则可以使用旧的可转义字符串字面量。为什么标准委员会决定用这些绝对不必要的括号来污染每个原始字符串文字的内容?这背后的原因是什么?我没有提到哪些专业人士? UPD Kerrek的答案很好,但不幸的是,这不是答案。由于我已经描述过,所以我了解它的工作原理以及它带来的好处。自从我问了这个问题已经过去了五年,但仍然没有答案。我仍然对该决定感到沮丧。可以说这是一种品味问题,但我不同意。你用多少空间,你怎么命名的变量,这是SomeFunction()还是some_function()-这是品味的问题。而且我真的可以轻松地从一种样式切换到另一种样式。 但这吗?。这么多年后仍然感到笨拙和笨拙。不,这与味道无关。这是关于无论如何我们都希望涵盖所有可能的情况。每当我们需要编写Windows特定路径,正则表达式或多行字符串文字时,我们注定要编写这些丑陋的括号。那又是什么?..对于那些实际上需要放入"字符串的罕见情况?我希望我在那个委员会会议上决定以这种方式这样做。我会坚决反对这个错误的决定。我希望。现在我们注定了。 感谢您阅读本文。现在我感觉好多了。 UPD2这是我的替代建议,我认为这两个建议都将比现有建议更好。 提议1.受python启发。无法支持带三引号的字符串文字:R"""Here is a …



4
字符数组应如何用作字符串?
我知道C中的字符串只是字符数组。因此,我尝试了以下代码,但给出了奇怪的结果,例如垃圾输出或程序崩溃: #include <stdio.h> int main (void) { char str [5] = "hello"; puts(str); } 为什么不起作用? 它可以用干净地编译gcc -std=c17 -pedantic-errors -Wall -Wextra。 注意:对于在声明字符串时未能为NUL终止符分配空间而引起的问题,本帖子旨在用作规范的FAQ。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.