aboutsummaryrefslogtreecommitdiffhomepage
path: root/docs/posts/cpp-you-can-use-keywords-in-attributes
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2021-10-02 09:56:32 +0900
committernsfisis <nsfisis@gmail.com>2021-10-02 09:56:32 +0900
commitaf111fca47bf952b83dd89eeb3306655b7e9479e (patch)
treeae443c1e96a17fef6a914edf656656a2c210761b /docs/posts/cpp-you-can-use-keywords-in-attributes
parent2372b30d11f7d1864746939974f2d0f2525739a4 (diff)
downloadnsfisis.github.io-af111fca47bf952b83dd89eeb3306655b7e9479e.tar.gz
nsfisis.github.io-af111fca47bf952b83dd89eeb3306655b7e9479e.tar.zst
nsfisis.github.io-af111fca47bf952b83dd89eeb3306655b7e9479e.zip
port my Qiita articles
Diffstat (limited to 'docs/posts/cpp-you-can-use-keywords-in-attributes')
-rw-r--r--docs/posts/cpp-you-can-use-keywords-in-attributes/index.html174
1 files changed, 174 insertions, 0 deletions
diff --git a/docs/posts/cpp-you-can-use-keywords-in-attributes/index.html b/docs/posts/cpp-you-can-use-keywords-in-attributes/index.html
new file mode 100644
index 0000000..e53832b
--- /dev/null
+++ b/docs/posts/cpp-you-can-use-keywords-in-attributes/index.html
@@ -0,0 +1,174 @@
+<!DOCTYPE html>
+<html lang="ja-JP">
+ <head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+
+ <title>[C&#43;&#43;] 属性構文の属性名にはキーワードが使える [[void]] [[for]] - REPL: Rest-Eat-Program Loop</title>
+
+ <meta name="description" content="この記事は Qiita から移植してきたものです。 元 URL: https://qiita.com/nsfisis/items/94090937bcf860cfa93b
+ タイトル落ち。まずはこのコードを見て欲しい。
+#include &lt;iostream&gt; [[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 &lt;&lt; &#34;Hello, World!">
+ <meta name="author" content="">
+
+ <link href="https://nsfisis.github.io/an-old-hope.min.css" rel="stylesheet">
+ <link href="https://nsfisis.github.io/style.css" rel="stylesheet">
+ <link href="https://nsfisis.github.io/custom.css" rel="stylesheet">
+
+ <link rel="apple-touch-icon" href="https://nsfisis.github.io/apple-touch-icon.png">
+ <link rel="icon" href="https://nsfisis.github.io/favicon.ico">
+ <meta name="generator" content="Hugo 0.88.1" />
+
+
+
+ <script>
+ function setTheme() {
+ if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
+ document.body.classList.add('dark');
+ return;
+ }
+
+ const time = new Date();
+ const prev = localStorage.getItem('date');
+ const date = String(time.getMonth() + 1) + '.' + String(time.getDate());
+
+ const now = time.getTime();
+ let sunrise;
+ let sunset;
+
+ function setBodyClass() {
+ if (now > sunrise && now < sunset) return;
+ document.body.classList.add('dark');
+ }
+
+ if (date !== prev) {
+ fetch('https://api.ipgeolocation.io/astronomy?apiKey=5ed37d85103e4defa5df4c5298ed5215')
+ .then((res) => res.json())
+ .then((data) => {
+ sunrise = data.sunrise.split(':').map(Number);
+ sunset = data.sunset.split(':').map(Number);
+ })
+ .catch(() => {
+ sunrise = [7, 0];
+ sunset = [19, 0];
+ })
+ .finally(() => {
+ sunrise = time.setHours(sunrise[0], sunrise[1], 0);
+ sunset = time.setHours(sunset[0], sunset[1], 0);
+ setBodyClass();
+ localStorage.setItem('sunrise', sunrise);
+ localStorage.setItem('sunset', sunset);
+ });
+ localStorage.setItem('date', date);
+ } else {
+ sunrise = Number(localStorage.getItem('sunrise'));
+ sunset = Number(localStorage.getItem('sunset'));
+ setBodyClass();
+ }
+ }
+ </script>
+ </head>
+ <body class="single">
+ <script>
+ setTheme();
+ </script>
+ <header class="header">
+ <nav class="nav">
+ <p class="logo"><a href="https://nsfisis.github.io">REPL: Rest-Eat-Program Loop</a></p>
+ </nav>
+ </header>
+ <main class="main">
+
+
+<article class="post-single">
+ <header class="post-header">
+ <h1 class="post-title">[C&#43;&#43;] 属性構文の属性名にはキーワードが使える [[void]] [[for]]</h1>
+ <div class="post-meta">October 2, 2021</div>
+ </header>
+ <div class="post-content"><p>この記事は Qiita から移植してきたものです。
+元 URL: <a href="https://qiita.com/nsfisis/items/94090937bcf860cfa93b">https://qiita.com/nsfisis/items/94090937bcf860cfa93b</a></p>
+<hr>
+<p>タイトル落ち。まずはこのコードを見て欲しい。</p>
+<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cpp" data-lang="cpp"><span style="color:#75715e">#include</span> <span style="color:#75715e">&lt;iostream&gt;</span><span style="color:#75715e">
+</span><span style="color:#75715e"></span>
+<span style="color:#a6e22e">[[alignas]] [[alignof]] [[and]] [[and_eq]] [[asm]] [[auto]] [[bitand]]</span>
+<span style="color:#a6e22e">[[bitor]] [[bool]] [[break]] [[case]] [[catch]] [[char]] [[char16_t]]</span>
+<span style="color:#a6e22e">[[char32_t]] [[class]] [[compl]] [[const]] [[const_cast]] [[constexpr]]</span>
+<span style="color:#a6e22e">[[continue]] [[decltype]] [[default]] [[delete]] [[do]] [[double]]</span>
+<span style="color:#a6e22e">[[dynamic_cast]] [[else]] [[enum]] [[explicit]] [[export]] [[extern]] [[false]]</span>
+<span style="color:#a6e22e">[[final]] [[float]] [[for]] [[friend]] [[goto]] [[if]] [[inline]] [[int]]</span>
+<span style="color:#a6e22e">[[long]] [[mutable]] [[namespace]] [[new]] [[noexcept]] [[not]] [[not_eq]]</span>
+<span style="color:#a6e22e">[[nullptr]] [[operator]] [[or]] [[or_eq]] [[override]] [[private]]</span>
+<span style="color:#a6e22e">[[protected]] [[public]] [[register]] [[reinterpret_cast]] [[return]] [[short]]</span>
+<span style="color:#a6e22e">[[signed]] [[sizeof]] [[static]] [[static_assert]] [[static_cast]] [[struct]]</span>
+<span style="color:#a6e22e">[[switch]] [[template]] [[this]] [[thread_local]] [[throw]] [[true]] [[try]]</span>
+<span style="color:#a6e22e">[[typedef]] [[typeid]] [[typename]] [[union]] [[unsigned]]</span>
+<span style="color:#a6e22e">[[virtual]] [[void]] [[volatile]] [[wchar_t]] [[while]] [[xor]] [[xor_eq]]</span>
+<span style="color:#75715e">// [[using]]
+</span><span style="color:#75715e"></span><span style="color:#66d9ef">int</span> main() {
+ std<span style="color:#f92672">::</span>cout <span style="color:#f92672">&lt;&lt;</span> <span style="color:#e6db74">&#34;Hello, World!&#34;</span> <span style="color:#f92672">&lt;&lt;</span> std<span style="color:#f92672">::</span>endl;
+}
+</code></pre></div><blockquote>
+<p>コンパイラのバージョン
+$ clang++ &ndash;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>コンパイルコマンド (C++17指定)
+$ clang++ &ndash;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>同サイトの [keywords のページ] (<a href="https://en.cppreference.com/w/cpp/keyword">https://en.cppreference.com/w/cpp/keyword</a>) から一覧を拝借し、上のコードが出来上がった (C++17 においてキーワードでないものなど、一部省いている)。
+大量の警告 (unknown attribute &lsquo;〇〇&rsquo; ignored) がコンパイラから出力されるが、コンパイルできる。</p>
+<p>上のコードでは <code>[[using]]</code> をコメントアウトしているが、これは <code>using</code> キーワードのみ属性構文の中で意味を持つからであり、このコメントアウトを外すとコンパイルに失敗する。</p>
+<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cpp" data-lang="cpp"><span style="color:#75715e">// using の例
+</span><span style="color:#75715e"></span><span style="color:#a6e22e">[[using foo: attr1, attr2]] int x; // [[foo::attr1, foo::attr2]]</span> <span style="color:#960050;background-color:#1e0010">の糖衣構文</span>
+</code></pre></div><p>C++17 の仕様も見てみる (正確には標準化前のドラフト)。</p>
+<p>引用元: <a href="https://timsong-cpp.github.io/cppwp/n4659/dcl.attr#grammar-4">https://timsong-cpp.github.io/cppwp/n4659/dcl.attr#grammar-4</a></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>
+</div>
+
+</article></main>
+<footer class="footer">
+ <span>&copy; 2021 <a href="https://nsfisis.github.io">REPL: Rest-Eat-Program Loop</a></span>
+ <span>&middot;</span>
+ <span>Powered by <a href="https://gohugo.io/" rel="noopener" target="_blank">Hugo️️</a>️</span>
+ <span>&middot;</span>
+ <span>Theme️ <a href="https://github.com/nanxiaobei/hugo-paper" rel="noopener" target="_blank">Paper</a></span>
+</footer>
+<script src="https://nsfisis.github.io/highlight.min.js"></script>
+<script>
+ hljs.initHighlightingOnLoad();
+</script>
+</body>
+</html>
+