我有一个类来包装字符串文字并在编译时计算大小.
构造函数如下所示:
template< std::size_t N >
Literal( const char (&literal)[N] );
// used like this
Literal greet( "Hello World!" );
printf( "%s, length: %d", greet.c_str(), greet.size() );
Run Code Online (Sandbox Code Playgroud)
但是代码有问题.下面的代码编译,我想使它成为一个错误.
char broke[] = { 'a', 'b', 'c' };
Literal l( broke );
Run Code Online (Sandbox Code Playgroud)
有没有办法限制构造函数,使它只接受c字符串文字?编译时间检测是首选,但如果没有更好的方法,则可以接受运行时.
这是一段C99代码:
int main(void)
{
char c[] = "\0";
printf("%d %d\n", sizeof(c), strlen(c));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该程序正在输出2 0
.我不明白为什么sizeof(c)
暗示2
看到我定义c
为立即NULL
终止的字符串文字.有人可以解释为什么会这样吗?你能否提供(某些)资源,我可以在我自己的时间进一步研究这种现象.
我正在寻找一些我即将开始使用的API的示例代码.以下模式让我有点困惑:
char* str;
str = const_cast<char*>("Hello World");
printf("%s ", str);
Run Code Online (Sandbox Code Playgroud)
(实际上,str
在每种情况下都有一个巨大的案例陈述.)
需要注意的是printf
需要const char*
.这种错综复杂的转换有任何合理的目的吗?这段代码的作者在其他地方应用了许多以性能为导向的技巧,但没有解释这里发生了什么.
我的直觉是将此代码更改为:
const char* str;
str = "Hello World";
printf("%s ", str);
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
我很惊讶地发现该代码未编译(假设我们使用的是C ++ 14编译器):
std::cout << "hello world!\n"s;
Run Code Online (Sandbox Code Playgroud)
ideone显示的错误如下:
找不到字符串文字运算符“ operator””
幸运的是,使用以下using
语句修复起来非常简单:
using namespace std::literals::string_literals;
std::cout << "hello world!\n"s; // Compiles!
Run Code Online (Sandbox Code Playgroud)
我想知道是否将标准字符串用户定义的文字放在不同于其std::string
本身的名称空间中的原因是什么?我一直在思考,但我不知道原因。
无法与operator""s
from 冲突,std::chrono
因为它们使用不同的类型:
auto ten_seconds = 10s; // ten seconds
auto some_string = "some string"s; // some string
Run Code Online (Sandbox Code Playgroud)
我在想,在resason可能是不会发生冲突与我的用户定义的文字,但该标准说的是我必须用preceed他们'_'
下划线:
警告:保留不带'_'的文字运算符后缀以供将来标准化
因此,我很惊讶,没有人知道将字符串文字运算符放入std::literals::string_literals
?中的原因。
谢谢。
我不知道我是否遗漏了某些内容,或者它确实不存在.在C++ 11标准中,添加了原始字符串文字:
string s = "\\w\\\\\\w"; // I hope I got that right
string s = R"(\w\\\w)"; // I'm pretty sure I got that right
Run Code Online (Sandbox Code Playgroud)
但我尝试使用原始字符文字的所有尝试都失败了:
constexpr char bslash = R('\'); // error: missing terminating ' character
constexpr char bslash = R'(\)'; // error: 'R' was not declared in this scope
Run Code Online (Sandbox Code Playgroud)
第二次尝试被认为是一个多字符常量!我发现使用类似于Raw字符文字的唯一方法是:
constexpr char slash = *R"(\)"; // All Ok.
Run Code Online (Sandbox Code Playgroud)
但我不喜欢这种表示法(取消引用字符串文字以存储第一个元素的副本),因为它有点令人困惑.
嗯,问题是什么?
通常,当您声明指针(例如int)时,您必须为其分配一个内存地址:
int value = 123;
int* p = &value;
Run Code Online (Sandbox Code Playgroud)
创建char指针时,可以为其指定char数组,而无需包含地址:
char* c = "Char Array";
Run Code Online (Sandbox Code Playgroud)
这是如何运作的?它是否分配内存并指向它?为什么其他类型的指针不能做同样的事情?
根据我的C++17(草案)版本(16.5.8 [over.literal]) 以及cppreference.com,C++17应该支持用户定义的字符串文字的模板化运算符。
具体来说:
template <char...>
double operator "" _pi() {
return 0.;
}
int main() {
"test"_pi;
}
Run Code Online (Sandbox Code Playgroud)
然而,gcc 和 clang 都对我大喊大叫:
// gcc -Wall -Wextra -pedantic -std=c++17
error: no matching function for call to 'operator""_pi<char, 't', 'e', 's', 't'>()'
7 | "test"_pi;
| ^~~~~~~~~
note: candidate: 'template<char ...<anonymous> > double operator""_pi()'
2 | double operator "" _pi() {
// clang -Wall -Wextra -pedantic -std=c++17
error: no matching literal operator for call to …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用我找到的 Shutil 脚本,但它收到了SyntaxError: unterminated string literal (detected at line 4)
. 任何有关修复此脚本或新脚本的帮助将不胜感激
import shutil
import os
source = r"C:\Users\[username]\Downloads\"
dest1 = r" C:\Users\[username]\Desktop\Reports\14"
dest2 = r" C:\Users\[username]\Desktop\Reports\52"
dest3 = r" C:\Users\[username]\Desktop\Reports\59"
files = os.listdir(source)
for f in files:
if (f.startswith("Log 14")):
shutil.move(f, dest1)
elif (f.startswith("Log 54")):
shutil.move(f, dest2)
Run Code Online (Sandbox Code Playgroud) 我有一个用 C++17 编写的代码库,它大量使用 UTF-8,以及u8
c++11 中引入的字符串文字来指示 UTF 编码。然而,c++20 将C++ 中u8
文字的含义从生成 a char
or更改const char*
为 a char8_t
or const char8_t*
;后者不能隐式指针转换为const char*
.
我希望这个项目能够支持在 C++17 和 C++20 模式下运行而不会出现中断;可以采取什么措施来支持这一点?
目前,该项目使用的char8
别名使用文字的类型结果u8
:
// Produces 'char8_t' in C++20, 'char' in anything earlier
using char8 = decltype(u8' ');
Run Code Online (Sandbox Code Playgroud)
但这种方法存在一些问题:
char
不保证是无符号的,这使得从数值生成代码点不可移植(例如,char8{129}
用 中断char
,但不能用 中断char8_t
)。
char8
char
与C++17 中没有区别,后者可能会破坏现有代码,并可能导致错误。
从第 2 点继续,不可能在 C++17 中重载char …
C++ 中无前缀字符串的编码是什么?例如,所有字符串文字在 Java 中都被解析并存储为 UTF-16,在 Python3 中则被解析为 UTF-8。我猜想 C++ 文字就是这种情况u8""
。但我不清楚像 之类的普通文字""
。
以下代码的输出应该是什么?
#include <iostream>
#include <iomanip>
int main() {
auto c = "Hello, World!";
while(*c) {
std::cout << std::hex << (unsigned int){*c++} << " ";
}
}
Run Code Online (Sandbox Code Playgroud)
当我在我的机器上运行它时,它会给出以下输出:
48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21
Run Code Online (Sandbox Code Playgroud)
但这有保证吗?字符串文字的 Cppreference 页面表示普通字符串文字中的字符来自翻译字符集,翻译字符集指出:
翻译字符集由以下元素组成:
- 由 ISO/IEC 10646 命名的每个字符,由其唯一的 UCS 标量值标识,以及
- 每个 UCS 标量值的不同字符,其中未分配命名字符。
从这个定义来看,翻译字符集似乎是指 Unicode(或其超集)。那么除了显性之外,""
和之间没有区别吗?u8""
假设如果我希望我的字符串采用 EBCDIC 编码(只是作为练习),那么在 …