C言語のプリプロセッサで##演算子を使って字句を結合させるときの話

C言語のプリプロセッサには難解なところがある。
中でも、マクロ置き換えにおける字句連結は難解だ。
例えば、以下のようにマクロが定義されていたとしよう。

#define JOIN1(x, y) x ## y         /* (a) */
#define JOIN2(x, y) JOIN1(x, y) /* (b) */

#define ZERO 0 /* (c) */


このとき、
JOIN1(var, ZERO)」は「varZERO」となり、
JOIN2(var, ZERO)」は「var0」となる。

何故このようになるのかは、大雑把には、「#演算子と##演算子は、引数の展開に優先する」と考えれば良いだろう。
置き換えがどのように進むのかを見ながら、このことを確認してみよう。

まずは、JOIN1の場合である。
JOIN1(var, ZERO)
(a)のマクロ定義により
var ## ZERO
引数の展開よりも優先して##演算子の連結処理を行うので
varZERO
varZEROを展開するマクロ定義はないので、これが最終的な置換結果となる。

次は、JOIN2の場合である。
JOIN2(var, ZERO)
 (b)のマクロ定義により
JOIN1(var, ZERO)
この段階の字句には#演算子も##演算子も含まれていないので、引数の展開を行う。varを展開するマクロ定義はないのでそのまま。ZEROは(c)のマクロ定義があるので0へ置換する。
JOIN1(var, 0)
(a)のマクロ定義により
var ## 0
引数の展開よりも先に##演算子の連結処理を行うので
var0
var0を展開するマクロ定義はないので、これが最終的な置換結果となる。  

さて、大雑把でない厳密な話は、C言語の規格書に載っている。
C90規格書を持っている方は、「6.8.3.1 実引数置換」と「6.8.3.3 ##演算子」の辺りを見ていただければと思う。
C90規格書なんて持っていないという方でも、日本工業標準調査会のJIS検索ページでJIS規格番号として「X3010」を検索することでC99規格書の閲覧が可能である。
C99規格書では、「6.10.3.1 実引数置換」と「6.10.3.3 ##演算子」の辺りが該当箇所である。

規格書を読んでみてていかがだろうか。
マクロは安易に使うべきではないという意見に多少は同意していただけるだろうか。
特にソースの書きやすさや読みやすさを求めている場合には、マクロの使用を考える前に、関数と構造体を中心とした設計を改善することを考えた方が良い場合がほとんどだと私は思う。

ちなみに、#演算子の機能は、引数を文字列リテラルに置き換えることである。規格書は、置き換える引数に空白やバックスラッシュやダブルクォートが含まれている場合などについて言及している。

なお、MISRA-C 2004には、19.12と19.13として#演算子と##演算子に関するルールがある。
また、CERT C セキュアコーディングスタンダードのPRE05-Cも#演算子と##演算子に関するものである。

スポンサーサイト

[更新] C言語規格の話: C90って何ですか?

C言語規格の話: C90って何ですか?」について、JIS検索ページへのリンク切れを修正しました。併せて脱字を1カ所修正しました。

[新着] C言語規格の話: C90って何ですか?

C言語規格の話: C90って何ですか?」を公開しました。

「君の名は」「シンデレラ」

ネタバレ注意:以下の文章はアニメ映画「君の名は。」のネタバレ要素を含みます。ご了解いただいた方のみ、ご覧下さい。


「君の名は。」がヒットした要因は複数あると思うが、その中の1つは力強く分かりやすい物語構造であり、その構造の中の1つは、シンデレラであるように思う。

シンデレラは義理の母と義理の姉にいじめられる境遇だった。
三葉は実の母を亡くしており、実の父親ともうまく行っていない。代々続く家のしきたりと父親の社会的立場は、学校でも三葉を浮いた存在にしていた。

シンデレラは城の舞踏会へ行きたかった。その願いを叶えたのは魔法使いである。そして、舞踏会で王子と出会う。
三葉の今の生活から抜け出したいという願いを叶えたのは、神社の神様である。三葉が「東京のイケメン」と言うので、神様は三葉と瀧を入れ替えた。結果、三葉は憧れの東京生活を堪能し、そして瀧と出会う。
ちなみに、劇中で東京が素晴らしい場所だと担保しているのは、これも大きなヒット要因であろう映像美だろう。話を戻そう。

シンデレラにかけられた魔法は、午前零時になると解け、ガラスの靴が残る。それを頼りにシンデレラと再会する王子。
彗星が落ちた後、二人の入れ替わりは起きなくなり、組紐が残る。それを頼りに三葉と再会する瀧。

それから二人はずっと幸せに暮らしましたとさ。


はて、本当にそうなのだろうか。史実として王子に嫁いだ女性は皆幸せになったのだろうか。

結局の所、彗星は落ちた。彗星が落ちたことすら覆るシナリオも選択できたであろうが、劇中で彗星は落ちた。彗星落下のことを考えるとき、多くの方が指摘するように、私も東日本大震災を連想してしまう。
三葉は、村の人々は、なぜ東京に出てきたのだろうか。彗星が、村から家と仕事を奪ったからではないのか。家を探して、仕事を探して、生活を立て直して。苦労が忍ばれる。
東京の人々は故郷を失った三葉にどう接しただろうか。東京での生活を経て、東京は憧れのままでいられたのだろうか。
災害のただ中で奮闘してくれた、そして、その後は何年も会っていなかった東京の人である瀧に、再開のそのとき、三葉は何を告げるのだろうか。

「人生フルーツ」を、この世界の片隅の視点から

昨日「人生フルーツ」というドキュメンタリー映画を見てきました。
とても素晴らしい映画だと感じたのですが、全ての人へ素晴らしさを伝えられるような文章を書く腕は私には無いので、
「この世界の片隅に」のファンの方へ向けて、映画パンフレットや公式サイトを参考に、「人生フルーツ」の紹介をしたいと思います。

「この世界の片隅に」を見て、主人公のすずさんやその家族は、今どうしているのだろうと考えたことはありませんか。
「人生フルーツ」は、愛知県にある高蔵寺ニュータウンの一隅に暮らす、すずさんと同年代のご夫婦のドキュメンタリーです。
津端 修一(つばた しゅういち)さんは、1925年生まれの90歳。奥様の英子(ひでこ)さんは、1928年生まれの87歳。
修一さんは、すずさんと同い年です。

ご夫婦は時間をかけた手仕事が大好きで、カメラは穏やかにその様子を写しています。
例えば、お二人が自宅の菜園で野菜や果物を育て収穫する様子。英子さんがそれらを材料に料理を作る様子。
お二人は本当に楽しそうです。
家の中も外も、ご夫婦がこつこつ、ゆっくり積み上げてきた手仕事の成果で満ちています。

それらの後ろには、ご夫婦の物語があります。例えば、なぜ、高蔵寺ニュータウンに家を建て、緑でいっぱいにしたのか。
そして、さらにその後ろには、日本の歴史があります。例えば、なぜ、全国各地にニュータウンが建設されたのか。

お二人の視点をお借りして、ニュータウンの片隅で現在から過去を振り返ることで、普段は見えていない今の日本の姿が浮かび上がるように思います。

と、ここまで書いてみましたが、これは重層的にいくつものテーマを内包するこの映画の見方の1つに過ぎません。
この映画は、ドキュメンタリーということもあり、基本的に淡々とご夫婦の日常を映し出していきます。
ですので、それをどのように捉えるかというのは、観客の自由であり、むしろ、人によって見方が違って良いのだと思います。
同じ映画を見て、違う見方をして、違う意見になって良いのだと思います。

一方で、この映画はノンフィクションのドキュメンタリーではありますが、制作者達の込めた意図やテーマも存在しています。
画角と時間が限られる以上、スクリーンに何を映して、何を映さないのかを、制作者達は決めなければなりません。
そして、題名を付けなくてはなりません。
繰り返し映し出される事物の大半には、意図があるのでしょう。
「人生フルーツ」という題名は、テーマそのものと見ることもできるでしょう。

ただ、この意図とテーマの存在が、本作品を単なる記録映像ではなく、映画たらしめている所以でもあります。
特に題名にあるフルーツ、つまり、果実は、植物が活動した結果として実る物で、熟したそれを他の生き物が食べて中の種を別の場所へ運ぶということもあり、何千年も前から何かを象徴する物として物語で利用され続けているわけです。
果物という観点、つまり、何が何を生んで、その種はどこへ行くのかという観点でこの映画を見たときに、
複数のテーマが、演出が、映像が、音声が、絡まり合って大きな構造が立ち上がる様には、脱帽するしかないわけです。

要するに何が言いたいかというと、この映画は傑作だということです。

プロフィール

gw

Author:gw
組み込みプログラマ
1984年生まれ
男性

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
FC2カウンター
メールフォーム

名前:
メール:
件名:
本文:

検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR