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

Is it legal to use in // C++ comment? (LaTeX equation in C++ comment)

本文关键字:C++ 评论 方程 LaTeX 是否 注释      更新时间:2023-10-16

出于文档目的,我需要在我的C++注释中添加一些LaTeX方程,例如:

//
// begin{eqnarray*}
//   y_1 &=& x_1 \
//   y_2 &=& x_2 
// end{eqnarray*}
//
int main() {}

使用 clang++(版本 9.0.1-10(,我可以毫无问题地编译我的代码:

clang++ -Wall prog.cpp 

但使用 G++(版本 9.2.1(

g++ -Wall prog.cpp 

我收到此警告:

prog.cpp:3:1: warning: multi-line comment [-Wcomment]
3 | //   y_1 &=& x_1 \
| ^

我的问题:哪个编译器是正确的?我可以合法地在评论中使用\C++//吗?

合法吗?是的。容易出错吗?是的。这就是您收到警告的原因。

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.

尽管 stackoverflow 的语法突出显示,但第 2 行和第 5 行并未编译。

如果您想知道,下一个令牌是///*.

// /* incomplete block comment
int compiled_code = 0;
/*
// this entire line isn't commented */ int compiled_code_2 = 0;

哪个编译器是正确的?

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

这样的评论是合法的,但它们可能会产生意想不到的影响,因此发出警告。结尾带有反斜杠的那一行之后的下一行是注释的延续,无论开头的//如何。所以这个

// \
Hey dude!
int main () {}

是一个有效的C++程序。不,最后一个之前的反斜杠不能作为转义。

如果要避免警告,请在行尾添加 LaTeX 注释:

// y_1 &=& x_1 \ % look ma, no warning

请注意,反斜杠和换行符之间的简单空格不一定能解决问题。海湾合作委员会文件说:

如果反斜杠和行尾之间有空格,则仍然是连续行。但是,由于这通常是编辑错误的结果,并且许多编译器不会接受它作为连续行,因此GCC会警告您。

根据 cpp 参考

C++样式的注释告诉编译器忽略//和换行符之间的所有内容。

所以你的评论应该是合法的。请注意,g++ 只给出警告,而不是错误。

G++ 警告转义换行符

每当注释开始序列"/"出现在"/

"注释中,或者每当反斜杠换行符出现在"//"注释中时发出警告。此警告由 -Wall 启用

哪个编译器是正确的?

双。警告不是关于"的合法使用",警告是关于多行注释的。

在 C 语言中,行尾的字符表示忽略换行符。所以两行:

// blabla
abcabc

和:

// blabalabcbc

完全等效。双反斜杠\只是一个由转义的反斜杠,因此它首先被反斜杠替换,然后预处理器检测反斜杠后跟换行符并删除换行符。这就是为什么它是危险的。

int a = 1;
// increase a \
a++;
printf("%dn", a); // will print `1`

一个实用的解决方案是使用/*多行注释。所以代码

/***
begin{eqnarray*}
y_1 &=& x_1 \
y_2 &=& x_2 
end{eqnarray*}
***/

你应该对识字的编程技术和像Doxygen这样的工具感兴趣。

我的建议是尝试Nuweb(至少如果你在Linux上编码(,特别是对于你的公共(和LaTeX记录的(头文件。您将编写一个Nuweb源文件(一些*.nw文件(,该文件一方面生成LaTeX,另一方面生成C代码(例如一些头文件(。

请注意,使用识字编程技术需要花费大量时间。 我个人但有限的经验是,它们值得在公共头文件上使用,而不是在实现细节和整个翻译单元上使用。

当然,您需要了解有关构建自动化工具(例如GNU make或ninja(的更多信息,并显式配置它们以适当地运行nuwebdoxygen可执行文件。