summaryrefslogtreecommitdiffhomepage
path: root/vhosts/blog/content/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes.ndoc
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2025-04-09 22:24:50 +0900
committernsfisis <nsfisis@gmail.com>2025-04-09 22:24:50 +0900
commitd1b4bc44170196a4dcef5254d092fc387e73792e (patch)
treea6bbe0e61b73c99a815d730ae7956a5124200066 /vhosts/blog/content/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes.ndoc
parentbba1212ab46ed85c2ed3b646f2362bdbb1f45b63 (diff)
parent4f46d262e6967c9c638b40f3b0246d21b7a9b9dc (diff)
downloadnsfisis.dev-d1b4bc44170196a4dcef5254d092fc387e73792e.tar.gz
nsfisis.dev-d1b4bc44170196a4dcef5254d092fc387e73792e.tar.zst
nsfisis.dev-d1b4bc44170196a4dcef5254d092fc387e73792e.zip
Merge branch 'nuldoc-djot'
Diffstat (limited to 'vhosts/blog/content/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes.ndoc')
-rw-r--r--vhosts/blog/content/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes.ndoc140
1 files changed, 0 insertions, 140 deletions
diff --git a/vhosts/blog/content/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes.ndoc b/vhosts/blog/content/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes.ndoc
deleted file mode 100644
index 244786dd..00000000
--- a/vhosts/blog/content/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes.ndoc
+++ /dev/null
@@ -1,140 +0,0 @@
----
-[article]
-uuid = "69863d75-ef21-42db-b743-5958f7c86827"
-title = "【C++】 属性構文の属性名にはキーワードが使える"
-description = "C++ の属性構文の属性名には、キーワードが使える。ネタ記事。"
-tags = [
- "cpp",
- "cpp17",
-]
-
-[[article.revisions]]
-date = "2021-10-02"
-remark = "Qiita から移植"
----
-<article>
- <note>
- この記事は Qiita から移植してきたものです。
- 元 URL: https://qiita.com/nsfisis/items/94090937bcf860cfa93b
- </note>
- <p>
- タイトル落ち。まずはこのコードを見て欲しい。
- </p>
- <codeblock language="cpp">
- <![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;
- }
- ]]>
- </codeblock>
- <blockquote>
- <p>
- コンパイラのバージョン $ 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
- </p>
- <p>
- コンパイルコマンド (C17指定) $ clang –std=c++17 hoge.cpp
- </p>
- </blockquote>
- <p>
- この記事から得られるものはこれ以上ないので以下は蛇足になる。
- </p>
- <p>
- 別件で cppreference.com の
- <a href="https://en.cppreference.com/w/cpp/language/identifiers">identifier
- のページ</a> を読んでいた時、次の文が目に止まった。
- </p>
- <blockquote>
- <ul>
- <li>
- the identifiers that are keywords cannot be used for other purposes;
- <ul>
- <li>
- 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)
- </li>
- </ul>
- </li>
- </ul>
- </blockquote>
- <p>
- キーワードでも属性として指定する場合は非キーワードとして使えるらしい。
- 実際にやってみる。
- </p>
- <p>
- 同サイトの <a href="https://en.cppreference.com/w/cpp/keyword">keywords のページ</a>
- から一覧を拝借し、上のコードが出来上がった (C++17
- においてキーワードでないものなど、一部省いている)。 大量の警告 (unknown
- attribute `〇〇' ignored)
- がコンパイラから出力されるが、コンパイルできる。
- </p>
- <p>
- 上のコードでは <code>[[using]]</code> をコメントアウトしているが、これは <code>using</code>
- キーワードのみ属性構文の中で意味を持つからであり、このコメントアウトを外すとコンパイルに失敗する。
- </p>
- <codeblock language="cpp">
- <![CDATA[
- // using の例
- [[using foo: attr1, attr2]] int x; // [[foo::attr1, foo::attr2]] の糖衣構文
- ]]>
- </codeblock>
- <p>
- C++17 の仕様も見てみる (正確には標準化前のドラフト)。
- </p>
- <p>
- 引用元: https://timsong-cpp.github.io/cppwp/n4659/dcl.attr#grammar-4
- </p>
- <blockquote>
- <p>
- 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.
- </p>
- </blockquote>
- <p>
- 「<code>identifier</code> の構文上の要件を満たすキーワードまたは代替トークンが
- <code>attribute-token</code> に含まれている場合、<code>identifier</code>
- とみなされる」とある。どうやら間違いないようだ。
- </p>
- <p>
- ところで、代替トークン (alternative token) とは <code>and</code> (<code>&amp;</code>) や <code>bitor</code>
- (<code>|</code>) などのことだが、<code>identifier</code>
- の構文上の要件を満たさないような代替トークンなどあるのか?
- 疑問に思って調べたところ、代替トークンという語にはダイグラフも含まれるらしい
- (参考:
- <a href="https://timsong-cpp.github.io/cppwp/n4659/lex.digraph">同ドラフト</a>)
- </p>
- <ul>
- <li><code>&lt;%</code> → <code>{</code></li>
- <li><code>%&gt;</code> → <code>}</code></li>
- <li><code>&lt;:</code> → <code>[</code></li>
- <li><code>:&gt;</code> → <code>]</code></li>
- <li><code>%:</code> → <code>#</code></li>
- <li><code>%:%:</code> → <code>##</code></li>
- </ul>
- <p>
- 「<code>identifier</code>
- の構文上の要件を満たさないような代替トークン」はこれらが当てはまると思われる。
- </p>
- <p>
- 調べた感想: 字句解析器か構文解析器が辛そう
- </p>
-</article>