我正在尝试学习flex,并希望匹配字符串文字.我的代码目前看起来像:
"\""([^\n\"\\]*(\\[.\n])*)*"\"" {/*matches string-literal*/;}
Run Code Online (Sandbox Code Playgroud)
我一直在努力与变化一个小时左右,并不能让它按照应有的方式工作.我基本上希望匹配一个不能包含换行符的字符串文字(除非它被转义)并支持转义字符.
我可能只是写一个糟糕的正则表达式或一个与flex不兼容的表达式.请指教!
考虑以下代码:
#include <iostream>
#include <string>
// void f(const char *) { std::cout << "const char *"; } // <-- comment on purpose
void f(const std::string &) { std::cout << "const std::string &"; }
void f(const void *) { std::cout << "const void *"; }
int main()
{
f("hello");
std::cout << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我编译了这个程序g++ (Ubuntu 6.5.0-1ubuntu1~16.04) 6.5.0 20181026:
$ g++ -std=c++11 strings_1.cpp -Wall
$ ./a.out
const void *
Run Code Online (Sandbox Code Playgroud)
请注意,注释是为了测试而存在,否则编译器使用f(const char *).
那么,为什么编译器会f(const void*)接管f(const std::string …
c++ overloading stdstring string-literals overload-resolution
如何在PowerShell字符串中编码Unicode字符U + 0048(H)?
在C#中我会这样做:"\u0048"但是这似乎在PowerShell中不起作用.
考虑以下代码片段:
bool foo(const std::string& s) {
return s == "hello"; // comparing against a const char* literal
}
bool bar(const std::string& s) {
return s == "hello"s; // comparing against a std::string literal
}
Run Code Online (Sandbox Code Playgroud)
在乍一看,它看起来像比对并const char*需要更少的组装说明1,作为使用字符串字面量会导致就地建设std::string。
(编辑:正如答案中指出的那样,我忘记了有效地s.compare(const char*)将被调用的事实foo(),因此在这种情况下当然不会进行就地构建。因此,请在下面删除一些行。)
但是,请operator==(const char*, const std::string&)参阅参考资料:
所有比较都是通过
compare()成员函数完成的。
根据我的理解,这意味着我们将需要构造一个结构 std::string来执行比较,因此我怀疑最终的开销将是相同的(尽管对的调用已将其隐藏了operator==)。
1我知道更少的汇编指令并不一定意味着更快的代码,但是我不想在这里进行微基准测试。
我最近一直在学习 C++ 并意识到 C++ 中的字符串文字必须是常量,而在 C 中,它们不是。这是一个例子。以下代码在 C 中有效,但在 C++ 中无效:
char* str = "Hello World";
Run Code Online (Sandbox Code Playgroud)
为了在 C++ 中做同样的事情,必须使用以下语句:
const char* str = "Hello World";
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么吗?
我有一个C++源文件和一个Python源文件.我希望C++源文件能够将Python源文件的内容用作大字符串文字.我可以这样做:
char* python_code = "
#include "script.py"
"
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为每条线的末尾都需要.我可以手动复制并粘贴Python代码的内容,并用引号和终止\n包围每一行,但这很难看.即使python源有效地编译到我的C++应用程序中,我也希望将它保存在一个单独的文件中,因为它更有条理,并且对编辑器更有效(emacs不够聪明,无法识别C字符串文字是python代码,当你在里面时切换到python模式).
请不要建议我使用PyRun_File,这是我首先要避免的;)
这两个字符)"在下面的示例中终止原始字符串文字.
序列)"可能会在某些时候出现在我的文本中,即使在其中找到此序列,我也希望字符串继续.
R"(
Some Text)"
)"; // ^^
Run Code Online (Sandbox Code Playgroud)
如何)"在字符串文字中包含序列而不终止它?
在微控制器上,为了避免加载之前固件版本的设置,我还存储编译时间,在加载时检查该时间。
\n该微控制器项目是使用MikroElektronika 的“ mikroC PRO for ARM”构建的。
\n为了方便调试,我在PC上用minGW编写了代码,左右检查后,将其放入microC中。
\n使用该检查的代码无法正常工作。经过一晚令人沮丧的调试后,我发现sizeof("...")在两个平台上产生了不同的值,并因此导致缓冲区溢出。
但现在我不知道这是谁的错。
\n要重新创建问题,请使用以下代码:
\n#define SAVEFILECHECK_COMPILE_DATE __DATE__ " " __TIME__\n\nchar strA[sizeof(SAVEFILECHECK_COMPILE_DATE)];\nchar strB[] = SAVEFILECHECK_COMPILE_DATE;\n\nprintf("sizeof(#def): %d\\n", (int)sizeof(SAVEFILECHECK_COMPILE_DATE));\nprintf("sizeof(strA): %d\\n", (int)sizeof(strA));\nprintf("sizeof(strB): %d\\n", (int)sizeof(strB));\nRun Code Online (Sandbox Code Playgroud)\n在 MinGW 上它返回(如预期):
\n#define SAVEFILECHECK_COMPILE_DATE __DATE__ " " __TIME__\n\nchar strA[sizeof(SAVEFILECHECK_COMPILE_DATE)];\nchar strB[] = SAVEFILECHECK_COMPILE_DATE;\n\nprintf("sizeof(#def): %d\\n", (int)sizeof(SAVEFILECHECK_COMPILE_DATE));\nprintf("sizeof(strA): %d\\n", (int)sizeof(strA));\nprintf("sizeof(strB): %d\\n", (int)sizeof(strB));\nRun Code Online (Sandbox Code Playgroud)\n然而,在“mikroC PRO for ARM”上,它返回:
\nsizeof(#def): 21\nsizeof(strA): 21\nsizeof(strB): 21\nRun Code Online (Sandbox Code Playgroud)\n这种差异导致了缓冲区溢出(覆盖了指针 \xe2\x80\x93 的字节零)。
\n21 是我期望的答案:20 个字符和 \'\\0\' …
I have discovered a disturbing inconsistency between std::string and string literals in C++0x:
#include <iostream>
#include <string>
int main()
{
int i = 0;
for (auto e : "hello")
++i;
std::cout << "Number of elements: " << i << '\n';
i = 0;
for (auto e : std::string("hello"))
++i;
std::cout << "Number of elements: " << i << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
The output is:
Number of elements: 6
Number of elements: 5
Run Code Online (Sandbox Code Playgroud)
I understand the mechanics of why this …
string-literals ×10
c++ ×7
c ×5
c++11 ×2
string ×2
c++14 ×1
c++17 ×1
escaping ×1
flex-lexer ×1
foreach ×1
include ×1
lex ×1
mikroc ×1
overloading ×1
pointers ×1
powershell ×1
regex ×1
sizeof ×1
stdstring ×1
unicode ×1