在 // C++ 注释中使用 \\ 是否合法?(C++ 注释中的 LaTeX 方程)

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)

我收到此警告:

prog.cpp:3:1: warning: multi-line comment [-Wcomment]
    3 | //   y_1 &=& x_1 \\
      | ^
Run Code Online (Sandbox Code Playgroud)

我的问题:哪个编译器是正确的?我可以\\在 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)

哪个编译器是对的?

两者都是,因为警告与标准无关。它们编译成功,这才是最重要的——它们都符合标准。


n. *_* m. 6

这样的评论是合法的,但它们可能会产生意想不到的效果,因此发出警告。末尾带有反斜杠的下一行是注释的延续,无论//开头是什么。所以这

// \\
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 会警告您。