C++11 添加了许多新关键字:alignas
,,,等等alignof
。constexpr
但它们似乎不受该listings
包支持。
\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}
\lstset{
language = [11]C++,
basicstyle = \ttfamily,
keywordstyle = \color{blue},
columns = flexible
}
\begin{document}
\begin{lstlisting}
constexpr int i = 0;
\end{lstlisting}
\end{document}
未被constexpr
识别为关键字:
预期输出:
如何启用 C++11 关键字?那么 C++20 关键字(例如requires
、concept
、consteval
等)如何?
(笔记:这是一个自答问题。我知道这个问题可以作为许多其他问题的重复而被关闭,例如用附加关键字来扩展语言?,但它们没有具体解决新的 C++ 关键字问题。我经常被问到这个问题,而且我也经常需要这个问题,所以我决定把它写下来以供将来参考。)
答案1
(参考:https://en.cppreference.com/w/cpp/keyword)
C++11 关键字
该listings
软件包内置了对 C++11 的支持。使用language = [11]C++
选项 alignas (无双关语) C++11:
\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}
\lstset{
language = [11]C++,
basicstyle = \ttfamily,
keywordstyle = \color{blue},
columns = flexible
}
\begin{document}
\begin{lstlisting}
constexpr int i = 0;
\end{lstlisting}
\end{document}
这将产生所需的结果:
C++11具有特殊含义的标识符
视为关键字
C++11 引入了两个具有特殊含义的标识符:override
和final
。默认情况下,它们不会突出显示。您可以手动将它们添加到关键字列表中:
\lstset{
morekeywords = {final, override}
}
最小示例:
\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}
\lstset{
language = [11]C++,
basicstyle = \ttfamily,
keywordstyle = \color{blue},
columns = flexible
}
\lstset{
morekeywords = {final, override}
}
\begin{document}
\begin{lstlisting}
override
final
\end{lstlisting}
\end{document}
得出:
特殊对待
如果您想要区分具有特殊含义的关键字和标识符,则可以通过为它们引入特殊的强调类来覆盖(无双关语):
\lstset{
emph = {[11]final, override},
emphstyle = \color{green}
}
最小示例:
\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}
\lstset{
language = [11]C++,
basicstyle = \ttfamily,
keywordstyle = \color{blue},
columns = flexible
}
\lstset{
emph = {[11]final, override},
emphstyle = \color{green}
}
\begin{document}
\begin{lstlisting}
constexpr
override
final
\end{lstlisting}
\end{document}
这产生了最终的结果(没有双关语的意思):
其他
为了方便以后参考,这里我给出了 C++20 关键字、具有特殊含义的 C++20 标识符等的列表。如果包的维护者listings
看到这个,请将相关部分添加到language = [20]C++
!
C++20 关键字
\lstset{
morekeywords = {
char8_t,
concept,
co_await,
co_return,
co_yield,
requires
}
}
具有特殊含义的 C++20 标识符
\lstset{
emph = {[20]
import,
module
}
}
(注意:原始版本包含audit
和axiom
。Contract TS 后来从 C++20 中删除,因此audit
和axiom
不再是 C++20 中具有特殊含义的标识符。)
事务内存技术规范 (TM TS) 关键字
\lstset{
morekeywords = {
atomic_cancel,
atomic_commit,
atomic_noexcept,
synchronized
}
}
具有特殊含义的事务内存技术规范 (TM TS) 标识符
\lstset{
emph = {[42]
transaction_safe,
transaction_dynamic
}
}
反射式 TS
\lstset{
morekeywords = {
reflexpr
}
}
(注意:所有数字都是任意选择的。不要忘记调整它们以避免与现有的标识符类发生名称冲突!)