C++11 关键字

C++11 关键字

C++11 添加了许多新关键字:alignas,,,等等alignofconstexpr但它们似乎不受该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 关键字(例如requiresconceptconsteval等)如何?

笔记:这是一个自答问题。我知道这个问题可以作为许多其他问题的重复而被关闭,例如用附加关键字来扩展语言?,但它们没有具体解决新的 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 引入了两个具有特殊含义的标识符:overridefinal。默认情况下,它们不会突出显示。您可以手动将它们添加到关键字列表中:

\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
  }
}

(注意:原始版本包含auditaxiom。Contract TS 后来从 C++20 中删除,因此auditaxiom不再是 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
  }
}

(注意:所有数字都是任意选择的。不要忘记调整它们以避免与现有的标识符类发生名称冲突!)

相关内容