C++ 11引入了用户定义的文字,这将允许基于现有文本(采用新的文本语法的int,hex,string,float),使得任何类型的将能够具有字介绍.
例子:
// imaginary numbers
std::complex<long double> operator "" _i(long double d) // cooked form
{
return std::complex<long double>(0, d);
}
auto val = 3.14_i; // val = complex<long double>(0, 3.14)
// binary values
int operator "" _B(const char*); // raw form
int answer = 101010_B; // answer = 42
// std::string
std::string operator "" _s(const char* str, size_t /*length*/)
{
return std::string(str);
}
auto hi = "hello"_s …Run Code Online (Sandbox Code Playgroud) 通常在C下gcc,我将从以下一组警告标志开始(从多个来源痛苦地组装):
-Wall -Wextra -Wformat-nonliteral -Wcast-align -Wpointer-arith -Wbad-function-cast \
-Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations -Winline -Wundef \
-Wnested-externs -Wcast-qual -Wshadow -Wwrite-strings -Wno-unused-parameter \
-Wfloat-equal -pedantic -ansi
Run Code Online (Sandbox Code Playgroud)
我将使用这组警告构建(至少我的调试版本)并修复我可能做的所有事情(通常是一切),然后只删除标记,如果它们不相关或不可修复(几乎从不这样).有时,-Werror如果我必须在编译时离开,我也会添加.
我只是拿起C++(是的,我落后了15年),我想从右脚开始.
我的问题是:是否有人为C++预先编译了类似的完整警告标志集g++?(我知道其中很多都是一样的.)
\字符串文字中的转义字符有哪些规则?是否有所有转义字符的列表?
特别是,当我\在gedit中的字符串文字中使用并按任意三个数字跟随它时,它会以不同的方式对它们进行着色.
我试图std::string用文字创建一个构造,其中0后跟空字符(\0)后跟字符0.然而,语法突出显示警告我,这可能会创建类似于0后跟空字符(\00,aka \0)的字符,也就是说,只有两个字符.
对于这个问题的解决方案,这是最好的方法:
std::string ("0\0" "0", 3) // String concatenation
Run Code Online (Sandbox Code Playgroud)
并且是否存在一些关于转义字符在字符串文字中的作用的参考?例如,'\ a'是什么?
在C中,字符串以null(\ 0)结尾,当您想在字符串中放置null时会导致问题.为什么不使用特殊的转义字符,例如\ $或其他东西?
我完全清楚这个问题是多么愚蠢,但我很好奇.
\0从给定字符串中删除char 的正确方法是什么.
我没有成功:
std::string msg(data); // Data comes from a remote system connected via socket...
msg.erase(std::remove(msg.begin(), msg.end(), '\0'), msg.end());
Run Code Online (Sandbox Code Playgroud)
这给出了编译错误:
error: cannot convert ‘std::__cxx11::basic_string<char>::iterator {aka __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >}’ to ‘const char*’ for argument ‘1’ to ‘int remove(const char*)’
Run Code Online (Sandbox Code Playgroud)
data来自使用套接字的远程系统,并且/0由于源逻辑而在中间包含几段代码.
在C/C++中,字符串以NULL结尾.
我可以stringstream像MemoryStreamC#一样用作内存流吗?
内存流的数据可能\0在数据中间具有值,但C++字符串以NULL结尾.
我正在使用Apache Thrift RPC(Compiled to C++)机制与Apache Flume进行通信.我必须使用此平台提供的特定API.
我想发送二进制数据,但RPC函数只接受std :: string作为参数.因此,我只能发送第一次出现0x00之前的二进制数据.
u_char bin[10] = {'a','b',1,'d','e',0,'2','3','4','5'};
// Takes only the first 5 bytes, and sets a length of 5
string art_test((const char *)bin);
Run Code Online (Sandbox Code Playgroud)
我搜索了源代码,我调用的函数将str.data()转换为(uint8_t*)并发送长度为str.size()的数据.
uint32_t ssize = static_cast<uint32_t>(str.size());
trans_->write((uint8_t*)str.data(), ssize);
Run Code Online (Sandbox Code Playgroud)
有没有办法创建一个'二进制字符串',uint8_t作为数据并具有指定的长度?甚至可能用所需的二进制数据创建我自己的字符串的内存表示.
我有问题std::string..
问题是'\0'被识别为字符串的结尾,就像在类似C的字符串中一样.
例如以下代码:
#include <iostream>
#include <string>
int main ()
{
std::string s ("String!\0 This is a string too!");
std::cout << s.length(); // same result as with s.size()
std::cout << std::endl << s;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
7
String!
Run Code Online (Sandbox Code Playgroud)
这里有什么问题?不应该像任何其他角色一样std::string对待'\0'?
我有一个关于std :: string和google协议缓冲库的简单问题.我已经定义了这样的消息:
message Source
{
required string Name = 1;
required uint32 Id = 2;
optional string ImplementationDLL = 3;
optional bytes Icon = 4;
}
Run Code Online (Sandbox Code Playgroud)
我想使用Icon字段发送图像,它很可能是一个png图像.在将其提供给protobuf编译器后,我得到了类似的东西来访问/操作Icon字段.
inline bool has_icon() const;
inline void clear_icon();
static const int kIconFieldNumber = 4;
inline const ::std::string& icon() const;
inline void set_icon(const ::std::string& value);
inline void set_icon(const char* value);
inline void set_icon(const void* value, size_t size);
inline ::std::string* mutable_icon();
Run Code Online (Sandbox Code Playgroud)
std :: string*mutable_icon()函数让我很头疼.它返回一个std :: string,但我相信字符串不能保存二进制数据!或者他们可以吗?
我可以使用set_icon(const void*,size_t)函数来放置二进制数据,但是我如何在另一端获取它?
我认为std :: string可能能够保存二进制数据,但是如何????