diff options
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.xml | 206 |
1 files changed, 124 insertions, 82 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 4ee22fe..7f5fc66 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,89 +16,131 @@ </revision> </revhistory> </info> - <simpara>この記事は Qiita から移植してきたものです。 元 URL: - <link xl:href="https://qiita.com/nsfisis/items/94090937bcf860cfa93b">https://qiita.com/nsfisis/items/94090937bcf860cfa93b</link></simpara> -<simpara><hr/></simpara> -<simpara>タイトル落ち。まずはこのコードを見て欲しい。</simpara> -<programlisting language="cpp" linenumbering="unnumbered">#include <iostream> + <simpara> + この記事は Qiita から移植してきたものです。 元 URL: + <link xl:href="https://qiita.com/nsfisis/items/94090937bcf860cfa93b">https://qiita.com/nsfisis/items/94090937bcf860cfa93b</link> + </simpara> + <simpara> + <hr/> + </simpara> + <simpara> + タイトル落ち。まずはこのコードを見て欲しい。 + </simpara> + <programlisting language="cpp" linenumbering="unnumbered"> + <![CDATA[ + #include <iostream> -[[alignas]] [[alignof]] [[and]] [[and_eq]] [[asm]] [[auto]] [[bitand]] -[[bitor]] [[bool]] [[break]] [[case]] [[catch]] [[char]] [[char16_t]] -[[char32_t]] [[class]] [[compl]] [[const]] [[const_cast]] [[constexpr]] -[[continue]] [[decltype]] [[default]] [[delete]] [[do]] [[double]] -[[dynamic_cast]] [[else]] [[enum]] [[explicit]] [[export]] [[extern]] [[false]] -[[final]] [[float]] [[for]] [[friend]] [[goto]] [[if]] [[inline]] [[int]] -[[long]] [[mutable]] [[namespace]] [[new]] [[noexcept]] [[not]] [[not_eq]] -[[nullptr]] [[operator]] [[or]] [[or_eq]] [[override]] [[private]] -[[protected]] [[public]] [[register]] [[reinterpret_cast]] [[return]] [[short]] -[[signed]] [[sizeof]] [[static]] [[static_assert]] [[static_cast]] [[struct]] -[[switch]] [[template]] [[this]] [[thread_local]] [[throw]] [[true]] [[try]] -[[typedef]] [[typeid]] [[typename]] [[union]] [[unsigned]] -[[virtual]] [[void]] [[volatile]] [[wchar_t]] [[while]] [[xor]] [[xor_eq]] -// [[using]] -int main() { -std::cout << "Hello, World!" << std::endl; -}</programlisting> -<blockquote> - <simpara>コンパイラのバージョン $ 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>コンパイルコマンド (C17指定) $ clang –std=c++17 hoge.cpp</simpara> -</blockquote> -<simpara>この記事から得られるものはこれ以上ないので以下は蛇足になる。</simpara> -<simpara>別件で cppreference.com の -<link xl:href="https://en.cppreference.com/w/cpp/language/identifiers">identifier -のページ</link> を読んでいた時、次の文が目に止まった。</simpara> -<blockquote> + [[alignas]] [[alignof]] [[and]] [[and_eq]] [[asm]] [[auto]] [[bitand]] + [[bitor]] [[bool]] [[break]] [[case]] [[catch]] [[char]] [[char16_t]] + [[char32_t]] [[class]] [[compl]] [[const]] [[const_cast]] [[constexpr]] + [[continue]] [[decltype]] [[default]] [[delete]] [[do]] [[double]] + [[dynamic_cast]] [[else]] [[enum]] [[explicit]] [[export]] [[extern]] [[false]] + [[final]] [[float]] [[for]] [[friend]] [[goto]] [[if]] [[inline]] [[int]] + [[long]] [[mutable]] [[namespace]] [[new]] [[noexcept]] [[not]] [[not_eq]] + [[nullptr]] [[operator]] [[or]] [[or_eq]] [[override]] [[private]] + [[protected]] [[public]] [[register]] [[reinterpret_cast]] [[return]] [[short]] + [[signed]] [[sizeof]] [[static]] [[static_assert]] [[static_cast]] [[struct]] + [[switch]] [[template]] [[this]] [[thread_local]] [[throw]] [[true]] [[try]] + [[typedef]] [[typeid]] [[typename]] [[union]] [[unsigned]] + [[virtual]] [[void]] [[volatile]] [[wchar_t]] [[while]] [[xor]] [[xor_eq]] + // [[using]] + int main() { + std::cout << "Hello, World!" << std::endl; + } + ]]> + </programlisting> + <blockquote> + <simpara> + コンパイラのバージョン $ 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> + コンパイルコマンド (C17指定) $ clang –std=c++17 hoge.cpp + </simpara> + </blockquote> + <simpara> + この記事から得られるものはこれ以上ないので以下は蛇足になる。 + </simpara> + <simpara> + 別件で cppreference.com の + <link xl:href="https://en.cppreference.com/w/cpp/language/identifiers">identifier + のページ</link> を読んでいた時、次の文が目に止まった。 + </simpara> + <blockquote> + <itemizedlist> + <listitem> + the identifiers that are keywords cannot be used for other purposes; + <itemizedlist> + <listitem> + The only place they can be used as non-keywords is in an + attribute-token. (e.g. [[private]] is a valid attribute) (since C++11) + </listitem> + </itemizedlist> + </listitem> + </itemizedlist> + </blockquote> + <simpara> + キーワードでも属性として指定する場合は非キーワードとして使えるらしい。 + 実際にやってみる。 + </simpara> + <simpara> + 同サイトの <link xl:href="https://en.cppreference.com/w/cpp/keyword">keywords のページ</link> + から一覧を拝借し、上のコードが出来上がった (C++17 + においてキーワードでないものなど、一部省いている)。 大量の警告 (unknown + attribute `〇〇' ignored) + がコンパイラから出力されるが、コンパイルできる。 + </simpara> + <simpara> + 上のコードでは <literal>[[using]]</literal> をコメントアウトしているが、これは <literal>using</literal> + キーワードのみ属性構文の中で意味を持つからであり、このコメントアウトを外すとコンパイルに失敗する。 + </simpara> + <programlisting language="cpp" linenumbering="unnumbered"> + <![CDATA[ + // using の例 + [[using foo: attr1, attr2]] int x; // [[foo::attr1, foo::attr2]] の糖衣構文 + ]]> + </programlisting> + <simpara> + C++17 の仕様も見てみる (正確には標準化前のドラフト)。 + </simpara> + <simpara> + 引用元: <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> + <blockquote> + <simpara> + 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> + </blockquote> + <simpara> + 「<literal>identifier</literal> の構文上の要件を満たすキーワードまたは代替トークンが + <literal>attribute-token</literal> に含まれている場合、<literal>identifier</literal> + とみなされる」とある。どうやら間違いないようだ。 + </simpara> + <simpara> + ところで、代替トークン (alternative token) とは <literal>and</literal> (<literal>&</literal>) や <literal>bitor</literal> + (<literal>|</literal>) などのことだが、<literal>identifier</literal> + の構文上の要件を満たさないような代替トークンなどあるのか? + 疑問に思って調べたところ、代替トークンという語にはダイグラフも含まれるらしい + (参考: + <link xl:href="https://timsong-cpp.github.io/cppwp/n4659/lex.digraph">同ドラフト</link>) + </simpara> <itemizedlist> - <listitem> - the identifiers that are keywords cannot be used for other purposes; - <itemizedlist> - <listitem> - The only place they can be used as non-keywords is in an - attribute-token. (e.g. [[private]] is a valid attribute) (since C++11) - </listitem> - </itemizedlist> - </listitem> + <listitem><literal><%</literal> → <literal>{</literal></listitem> + <listitem><literal>%></literal> → <literal>}</literal></listitem> + <listitem><literal><:</literal> → <literal>[</literal></listitem> + <listitem><literal>:></literal> → <literal>]</literal></listitem> + <listitem><literal>%:</literal> → <literal>#</literal></listitem> + <listitem><literal>%:%:</literal> → <literal>##</literal></listitem> </itemizedlist> -</blockquote> -<simpara>キーワードでも属性として指定する場合は非キーワードとして使えるらしい。 -実際にやってみる。</simpara> -<simpara>同サイトの <link xl:href="https://en.cppreference.com/w/cpp/keyword">keywords のページ</link> - から一覧を拝借し、上のコードが出来上がった (C++17 - においてキーワードでないものなど、一部省いている)。 大量の警告 (unknown - attribute `〇〇' ignored) - がコンパイラから出力されるが、コンパイルできる。</simpara> -<simpara>上のコードでは <literal>[[using]]</literal> をコメントアウトしているが、これは <literal>using</literal> - キーワードのみ属性構文の中で意味を持つからであり、このコメントアウトを外すとコンパイルに失敗する。</simpara> -<programlisting language="cpp" linenumbering="unnumbered">// using の例 -[[using foo: attr1, attr2]] int x; // [[foo::attr1, foo::attr2]] の糖衣構文</programlisting> -<simpara>C++17 の仕様も見てみる (正確には標準化前のドラフト)。</simpara> -<simpara>引用元: <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> -<blockquote> - <simpara>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> -</blockquote> -<simpara>「<literal>identifier</literal> の構文上の要件を満たすキーワードまたは代替トークンが -<literal>attribute-token</literal> に含まれている場合、<literal>identifier</literal> -とみなされる」とある。どうやら間違いないようだ。</simpara> -<simpara>ところで、代替トークン (alternative token) とは <literal>and</literal> (<literal>&</literal>) や <literal>bitor</literal> - (<literal>|</literal>) などのことだが、<literal>identifier</literal> - の構文上の要件を満たさないような代替トークンなどあるのか? - 疑問に思って調べたところ、代替トークンという語にはダイグラフも含まれるらしい - (参考: - <link xl:href="https://timsong-cpp.github.io/cppwp/n4659/lex.digraph">同ドラフト</link>)</simpara> -<itemizedlist> - <listitem><literal><%</literal> → <literal>{</literal></listitem> - <listitem><literal>%></literal> → <literal>}</literal></listitem> - <listitem><literal><:</literal> → <literal>[</literal></listitem> - <listitem><literal>:></literal> → <literal>]</literal></listitem> - <listitem><literal>%:</literal> → <literal>#</literal></listitem> - <listitem><literal>%:%:</literal> → <literal>##</literal></listitem> -</itemizedlist> -<simpara>「<literal>identifier</literal> - の構文上の要件を満たさないような代替トークン」はこれらが当てはまると思われる。</simpara> -<simpara>調べた感想: 字句解析器か構文解析器が辛そう</simpara> + <simpara> + 「<literal>identifier</literal> + の構文上の要件を満たさないような代替トークン」はこれらが当てはまると思われる。 + </simpara> + <simpara> + 調べた感想: 字句解析器か構文解析器が辛そう + </simpara> </article> |
