aboutsummaryrefslogtreecommitdiffhomepage
path: root/content/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes.xml
diff options
context:
space:
mode:
Diffstat (limited to 'content/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes.xml')
-rw-r--r--content/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes.xml68
1 files changed, 34 insertions, 34 deletions
diff --git a/content/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes.xml b/content/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes.xml
index 7f5fc66..3dbb8ff 100644
--- a/content/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes.xml
+++ b/content/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes.xml
@@ -16,16 +16,16 @@
</revision>
</revhistory>
</info>
- <simpara>
+ <para>
この記事は Qiita から移植してきたものです。 元 URL:
<link xl:href="https://qiita.com/nsfisis/items/94090937bcf860cfa93b">https://qiita.com/nsfisis/items/94090937bcf860cfa93b</link>
- </simpara>
- <simpara>
+ </para>
+ <para>
<hr/>
- </simpara>
- <simpara>
+ </para>
+ <para>
タイトル落ち。まずはこのコードを見て欲しい。
- </simpara>
+ </para>
<programlisting language="cpp" linenumbering="unnumbered">
<![CDATA[
#include <iostream>
@@ -50,24 +50,24 @@
]]>
</programlisting>
<blockquote>
- <simpara>
+ <para>
コンパイラのバージョン $ clang++ –version Apple clang version 11.0.0
(clang-1100.0.33.8) Target: x86_64-apple-darwin19.6.0 Thread model:
posix InstalledDir:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
- </simpara>
- <simpara>
+ </para>
+ <para>
コンパイルコマンド (C17指定) $ clang –std=c++17 hoge.cpp
- </simpara>
+ </para>
</blockquote>
- <simpara>
+ <para>
この記事から得られるものはこれ以上ないので以下は蛇足になる。
- </simpara>
- <simpara>
+ </para>
+ <para>
別件で cppreference.com の
<link xl:href="https://en.cppreference.com/w/cpp/language/identifiers">identifier
のページ</link> を読んでいた時、次の文が目に止まった。
- </simpara>
+ </para>
<blockquote>
<itemizedlist>
<listitem>
@@ -81,53 +81,53 @@
</listitem>
</itemizedlist>
</blockquote>
- <simpara>
+ <para>
キーワードでも属性として指定する場合は非キーワードとして使えるらしい。
実際にやってみる。
- </simpara>
- <simpara>
+ </para>
+ <para>
同サイトの <link xl:href="https://en.cppreference.com/w/cpp/keyword">keywords のページ</link>
から一覧を拝借し、上のコードが出来上がった (C++17
においてキーワードでないものなど、一部省いている)。 大量の警告 (unknown
attribute `〇〇' ignored)
がコンパイラから出力されるが、コンパイルできる。
- </simpara>
- <simpara>
+ </para>
+ <para>
上のコードでは <literal>[[using]]</literal> をコメントアウトしているが、これは <literal>using</literal>
キーワードのみ属性構文の中で意味を持つからであり、このコメントアウトを外すとコンパイルに失敗する。
- </simpara>
+ </para>
<programlisting language="cpp" linenumbering="unnumbered">
<![CDATA[
// using の例
[[using foo: attr1, attr2]] int x; // [[foo::attr1, foo::attr2]] の糖衣構文
]]>
</programlisting>
- <simpara>
+ <para>
C++17 の仕様も見てみる (正確には標準化前のドラフト)。
- </simpara>
- <simpara>
+ </para>
+ <para>
引用元: <link xl:href="https://timsong-cpp.github.io/cppwp/n4659/dcl.attr#grammar-4">https://timsong-cpp.github.io/cppwp/n4659/dcl.attr#grammar-4</link>
- </simpara>
+ </para>
<blockquote>
- <simpara>
+ <para>
If a keyword or an alternative token that satisfies the syntactic
requirements of an identifier is contained in an attribute-token, it is
considered an identifier.
- </simpara>
+ </para>
</blockquote>
- <simpara>
+ <para>
「<literal>identifier</literal> の構文上の要件を満たすキーワードまたは代替トークンが
<literal>attribute-token</literal> に含まれている場合、<literal>identifier</literal>
とみなされる」とある。どうやら間違いないようだ。
- </simpara>
- <simpara>
+ </para>
+ <para>
ところで、代替トークン (alternative token) とは <literal>and</literal> (<literal>&amp;</literal>) や <literal>bitor</literal>
(<literal>|</literal>) などのことだが、<literal>identifier</literal>
の構文上の要件を満たさないような代替トークンなどあるのか?
疑問に思って調べたところ、代替トークンという語にはダイグラフも含まれるらしい
(参考:
<link xl:href="https://timsong-cpp.github.io/cppwp/n4659/lex.digraph">同ドラフト</link>)
- </simpara>
+ </para>
<itemizedlist>
<listitem><literal>&lt;%</literal> → <literal>{</literal></listitem>
<listitem><literal>%&gt;</literal> → <literal>}</literal></listitem>
@@ -136,11 +136,11 @@
<listitem><literal>%:</literal> → <literal>#</literal></listitem>
<listitem><literal>%:%:</literal> → <literal>##</literal></listitem>
</itemizedlist>
- <simpara>
+ <para>
「<literal>identifier</literal>
の構文上の要件を満たさないような代替トークン」はこれらが当てはまると思われる。
- </simpara>
- <simpara>
+ </para>
+ <para>
調べた感想: 字句解析器か構文解析器が辛そう
- </simpara>
+ </para>
</article>