Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++无法调用STD::_C++_String_Macros - Fatal编程技术网

C++无法调用STD::

C++无法调用STD::,c++,string,macros,C++,String,Macros,以更好的方式提出问题: 有一个日志标准C++类,其标准为: 20.5.4.3.2宏名称 1包含标准库标题的翻译单元不得 定义或取消定义在任何标准库标题中声明的名称 2翻译单位不得在词汇上定义或取消定义名称 与关键字、表4中列出的标识符或 10.6中描述的属性标记 因此,标准禁止您尝试执行的操作 此外,在这种特定情况下,它将不起作用,因为您正在用endl替换某种类型的字符串,从而导致预处理器生成:std::\n\r,这将导致编译失败 如果您不想将std::endl替换为\r\n顺便说一句:not\

以更好的方式提出问题:

有一个日志标准C++类,其标准为:

20.5.4.3.2宏名称

1包含标准库标题的翻译单元不得 定义或取消定义在任何标准库标题中声明的名称

2翻译单位不得在词汇上定义或取消定义名称 与关键字、表4中列出的标识符或 10.6中描述的属性标记

因此,标准禁止您尝试执行的操作

此外,在这种特定情况下,它将不起作用,因为您正在用endl替换某种类型的字符串,从而导致预处理器生成:std::\n\r,这将导致编译失败


如果您不想将std::endl替换为\r\n顺便说一句:not\n\r,请手动或编写脚本来执行此操作

如前所述,不允许定义名为endl的宏。但是,您可以在名称空间std之外声明名为endl的varaiable。所以你本来可以

// where the macro is currently define:
extern char const endl[3];

// in a suitable source file including the header with the above declaration:
char const endl[3] = "\n\r";
观察到的行为应该与使用宏相同,只是该声明可以与std::endl共存。这就假定你不使用我认为相当奇怪的L。想一想,我可以想象你用的是Tendl,它几乎把这个L加了起来,但准确地把L连在了名字上。如果是这样的话,你还可以加上

extern wchar_t const Lendl[];
具有相应的定义

如果您想像使用std::endl一样使用endl,但使用了一些不同的行为,我建议您也用类似的方式定义它:

template <typename cT, typename Traits>
std::basic_ostream<cT, Traits>& endl(std::basic_ostream<cT, Traits>& out) {
    return out << out.widen('\n') << out.widen('\r');
}

当然,当将“\n”字符发送到以文本模式打开的std::ofstream或std::wofstream(即,不使用std::ios_base::binary)时,会将其转换为[特定于平台的]行尾序列。

std::endl在中定义。你有进口的吗?第一个问题:你为什么要这样做?endl工作得很好。错误说明:define是在编译之前执行的预处理器指令,因此每次出现endl都会被一个完全不相关的注释\n\r替换:回车和换行的常用方式是按此顺序,即。\r\n。许多标准都是这样规定的,顺序是这样的。为了是的,它是有效的。实际上,您可以执行类似于定义endOfTheLine std::endl的操作。通常,对于需要它的系统上的文本流,库应该将“\n”翻译成\r\n。这就是为什么在打开流时有文本和二进制模式,所以库应该知道是否应该进行翻译。也许您应该在另一个问题中询问为什么不针对您的流进行翻译?用a来显示你在做什么。我要补充一点,在这种情况下它不起作用不是因为它是UB,而是因为它变成了std::等等,这是胡说八道。好吧,同意,std::endl仅支持\n Am将其用于日志记录,因此我们需要\n\r否则新日志从上一行在其下方结束的位置开始,而不是从下一行开始。@HolyBlackCat感谢您的反馈。我已经编辑了答案。@sach您使用什么来查看日志?也许可以使用更好的文本编辑器来正确显示\n?@sach:注意std::endl插入了一个“\n”字符。但是,当以文本模式(即非std::ios_base::binary模式)打开文件流时,每个“\n”字符将转换为平台的行尾序列-独立于插入的任何其他字符,这也将完成行尾序列。
extern wchar_t const Lendl[];
template <typename cT, typename Traits>
std::basic_ostream<cT, Traits>& endl(std::basic_ostream<cT, Traits>& out) {
    return out << out.widen('\n') << out.widen('\r');
}