link もっと前
   2017年 4月 19日 -
      2017年 4月 19日  
link もっと後

link 未来から過去へ表示(*)
link 過去から未来へ表示

日々

link permalink

include の謎の文法

C/C++ 言語のヘッダをインクルードする #include ディレクティブには 2つの指定方法があります。1つは #include <cstdio> のように山括弧で囲う方法、もう 1つは #include "cstdio" のように二重引用符で囲う方法です。

このうち山括弧で囲う方は少し変わった文法規則になっており、ファイル名に '>' や改行を指定できない特徴があります。詳細は下記の通りです。

#include <...> の文法規則
N3797 Working Draft, Standard for Programming Language C++ より

----

control-line:
  # include pp-tokens new-line
  (...略...)

pp-tokens:
  preprocessing-token
  pp-tokens preprocessing-token

preprocessing-token:
  header-name    ★これ
  identifier
  pp-number
  character-literal
  user-defined-character-literal
  string-literal
  user-defined-string-literal
  preprocessing-op-or-punc
  each non-white-space character that cannot be one of the above

header-name:
  < h-char-sequence >    ★これ
  " q-char-sequence "

h-char-sequence:
  h-char
  h-char-sequence h-char

h-char:
  any member of the source character set except new-line and >

注目すべきは文字列リテラルと異なり、エスケープ規則がないことです。エスケープしようとして \> と書いても「バックスラッシュと山括弧」と認識されてしまい '>' を指定したことになりません。

従って、もしヘッダのファイル名に '>' が含まれていると、#include "..." ではインクルードできるのに、#include <...> ではインクルードできない、変なヘッダファイルになってしまいます。C/C++ 言語の制約と言えば制約ですけど、そんな変なヘッダ名を付ける人は居ないので、ほぼ実害はありません。

規格書を見ると、header-name は #include 専用と言って良いほどの特殊な文法です。何気なく使っている #include の意外な一面を見た気がします。

[編集者: すずき]
[更新: 2017年 4月 21日 00:24]
link 編集する

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
   2017年 4月 19日 -
      2017年 4月 19日  
link もっと後

管理用メニュー

link 記事を新規作成

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDF ファイル RSS 1.0
QR コード QR コード

最終更新: 10/16 01:37

カレンダー

<2017>
<<<04>>>
------1
2345678
9101112131415
16171819202122
23242526272829
30------

最近のコメント 5件

  • link 18年10月12日
    すずき 「なるほど!\n京急、京成はヤバそうですね...」
    (更新:10/15 23:02)
  • link 18年10月12日
    ちかふみ 「閉会式直後の出国ラッシュ対策のためだそう...」
    (更新:10/15 20:43)
  • link 18年10月12日
    すずき 「あー、なるほど!閉会式の次にくっつけたん...」
    (更新:10/14 15:44)
  • link 18年10月12日
    hdk 「2020年の東京オリンピックが8月9日ま...」
    (更新:10/14 10:45)
  • link 18年09月07日
    すずき 「ありがとう!\nこちらこそ、楽しみにして...」
    (更新:09/11 19:30)

最近の記事 3件

link もっとみる
  • link 18年10月14日
    すずき 「[ROCK64 の I2S とクロック] また忘れてしまいそうなの...」
    (更新:10/16 01:37)
  • link 18年10月13日
    すずき 「[Welcome back ROCK64] やっと ROCK64 ...」
    (更新:10/15 23:20)
  • link 18年10月11日
    すずき 「[俺たちの引っ越しはまだ終わらない] 引っ越しの荷物は、終盤にヤケ...」
    (更新:10/15 23:19)

こんてんつ

open/close wiki
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報