我不知道C和C++允许multicharacter literal:不是'c'(C中的int类型和C++中的char),但'tralivali'(类型为int!)
enum
{
ActionLeft = 'left',
ActionRight = 'right',
ActionForward = 'forward',
ActionBackward = 'backward'
};
Run Code Online (Sandbox Code Playgroud)
标准说:
C99 6.4.4.4p10:"包含多个字符(例如,'ab')的整数字符常量的值,或包含未映射到单字节执行字符的字符或转义序列的值是实现定义的".
我发现它们广泛用于C4发动机.但是,当我们谈论平台独立序列化时,我认为它们并不安全.Thay也会让人感到困惑,因为看起来像字符串.那么什么是多字符文字的使用范围,它们对某些东西有用吗?他们是否只是为了与C代码兼容而使用C++?它们被认为是goto运算符的坏特征吗?
我知道在C++ 03中,从技术上讲,std::basic_string模板不需要具有连续的内存.但是,我很好奇有多少实现存在于实际利用这种自由的现代编译器.例如,如果想要用来basic_string接收某些C API的结果(如下面的例子),分配一个向量只是为了立即将它变成一个字符串似乎很愚蠢.
例:
DWORD valueLength = 0;
DWORD type;
LONG errorCheck = RegQueryValueExW(
hWin32,
value.c_str(),
NULL,
&type,
NULL,
&valueLength);
if (errorCheck != ERROR_SUCCESS)
WindowsApiException::Throw(errorCheck);
else if (valueLength == 0)
return std::wstring();
std::wstring buffer;
do
{
buffer.resize(valueLength/sizeof(wchar_t));
errorCheck = RegQueryValueExW(
hWin32,
value.c_str(),
NULL,
&type,
&buffer[0],
&valueLength);
} while (errorCheck == ERROR_MORE_DATA);
if (errorCheck != ERROR_SUCCESS)
WindowsApiException::Throw(errorCheck);
return buffer;
Run Code Online (Sandbox Code Playgroud)
我知道像这样的代码可能会略微降低可移植性,因为它意味着它std::wstring是连续的 - 但我想知道这个代码是多么不可移植.换句话说,编译器如何实际利用具有非连续内存的自由?
编辑:我更新了这个问题,提到C++ 03.读者应注意,在定位C++ 11时,标准现在要求basic_string是连续的,因此在定位该标准时,上述问题不是问题.
我知道C/C++标准只能保证每个字符最少 8位,理论上9/16/42 /其他任何东西都是可能的,因此所有关于编写可移植代码的网站都会警告不要假设8bpc.我的问题是"非便携式"这是真的吗?
让我解释.在我看来,有三类系统:
char不完全是 8位,我会感到非常惊讶.(如果我错了,请纠正我)char位数比8位多,我不会感到非常惊讶,但我还没有听说过一个这样的系统(如果我不知道的话,请再次通知我)底线:是否有共同的(大于%0.001)平台(在类别1和2以上),其中char是不是 8位?我的上述猜测是真的吗?