C++无法调用std :: endl

sac*_*ach -5 c++ string macros

以更好的方式构思问题:

有一个logger C++类,它有<<运算符重载以接受整数,字符串..

logR <<"Test"<<endl
Run Code Online (Sandbox Code Playgroud)

现在endl被定义为宏

#define endl "\n\r" 
Run Code Online (Sandbox Code Playgroud)

现在在任何.cpp文件中,如果我包含此记录器类的头文件,我曾经得到使用endl的编译错误.

找到一个修复此问题而不是定义宏endl,我重载运算符以接收endl()本身.感谢它帮助解决问题的输入.

muX*_*t2X 5

从标准N4687:

20.5.4.3.2宏名称

1包含标准库头的转换单元不得在任何标准库头中声明#define或#undef名称.

2翻译单元不得#define或#undef名称与关键字词汇相同,表4中列出的标识符或10.6中描述的属性标记.

因此,标准禁止您尝试做的事情!

此外,在这种特定情况下,它将无法工作,因为您要替换endl某种类型的字符串,导致预处理器生成:std::"\n\r"这会导致编译失败.


如果你wan't更换std::endl"\r\n"(顺便说一句:没有"\n\r"),然后用手工做,或编写一个脚本来做到这一点.

  • @sach:注意`std :: endl`插入一个`'\n'`字符.但是,当以文本模式打开文件流时(即,非``std :: ios_base :: binary`模式),每个''\n'`字符被转换为平台的行结束序列 - 独立于任何其他字符插入也将完成行序列的结束. (2认同)