Pic*_*ent 11 c++ g++ language-lawyer clang++
出于文档目的,我需要在我的 C++ 注释中添加一些 LaTeX 方程,例如:
//
// \begin{eqnarray*}
// y_1 &=& x_1 \\
// y_2 &=& x_2
// \end{eqnarray*}
//
int main() {}
Run Code Online (Sandbox Code Playgroud)
使用 clang++(版本 9.0.1-10)我可以毫无问题地编译我的代码:
clang++ -Wall prog.cpp
Run Code Online (Sandbox Code Playgroud)
但是使用 g++(版本 9.2.1)
g++ -Wall prog.cpp
Run Code Online (Sandbox Code Playgroud)
我收到此警告:
Run Code Online (Sandbox Code Playgroud)prog.cpp:3:1: warning: multi-line comment [-Wcomment] 3 | // y_1 &=& x_1 \\ | ^
我的问题:哪个编译器是正确的?我可以\\在 C++//注释中合法使用吗?
小智 10
合法吗?是的。容易出错吗?是的。这就是您收到警告的原因。
C/C++ 标准首先有一个标记(首先处理): \
此标记删除换行符。考虑以下代码:
1. // the below code is commented out \
2. despite not having a comment at the beginning of the line
3.
4. // it's important to be careful because \\
5. int not_compiled_code = 0;
6. // the above code is not compiled.
Run Code Online (Sandbox Code Playgroud)
尽管 stackoverflow 的语法高亮显示,第 2 行和第 5 行没有被编译。
如果您想知道,下一个标记是//和/*。
// /* incomplete block comment
int compiled_code = 0;
/*
// this entire line isn't commented */ int compiled_code_2 = 0;
Run Code Online (Sandbox Code Playgroud)
哪个编译器是对的?
两者都是,因为警告与标准无关。它们编译成功,这才是最重要的——它们都符合标准。
这样的评论是合法的,但它们可能会产生意想不到的效果,因此发出警告。末尾带有反斜杠的下一行是注释的延续,无论//开头是什么。所以这
// \\
Hey dude!
int main () {}
Run Code Online (Sandbox Code Playgroud)
是一个有效的 C++ 程序。不,最后一个之前的反斜杠不能用作转义符。
如果您想避免出现警告,请在行尾添加 LaTeX 注释:
// y_1 &=& x_1 \\ % look ma, no warning
Run Code Online (Sandbox Code Playgroud)
请注意,反斜杠和换行符之间的简单空格不一定能解决问题。GCC 文档说:
如果反斜杠和行尾之间有空格,那仍然是连续行。然而,由于这通常是编辑错误的结果,而且许多编译器不会将其作为续行接受,GCC 会警告您。
| 归档时间: |
|
| 查看次数: |
229 次 |
| 最近记录: |