C ディレクティブのソースを表示
新しいページはコチラ
移動:
案内
,
検索
※このページではC言語にも存在していたという意味で記事タイトルがC ディレクティブになっていますが、<br /> [[C PlusPlus|C++]]でも同様です。[[C PlusPlus|C++]]だけの機能がある場合は明記します。<br /> <br /> == '''ディレクティブ''' == ディレクティブとは日本語で指示するという意味でDirectiveは映画やドラマのDirectorでも同じような意味で制作指揮者・監督というような意味で使われます。プリプロセスを指示するための命令文がディレクティブであることについては[[C プリプロセッサ]]の項目で記述しました。 ディレクティブは主に#記号からはじまる命令文で記述され、プログラムのどこの部分でも利用されることもありますが、基本的にはプログラムコードを記述したテキストの先頭に集中して記載されることが多いです。プログラムの途中でよく使われるディレクティブも存在します。 では、どういったディレクティブがあるのかを、以下に一覧します。既によく知っているものから、あまり使わないものまであるかもしれませんが、必要な範囲で必要なだけここにそれぞれのディレクティブの意味や使い方を記述します。 *[[C ディレクティブ##include|#include]] *[[C ディレクティブ##using|#using]] *[[C ディレクティブ##import|#import]] *[[C ディレクティブ##line|#line]] *[[C ディレクティブ##error|#error]] *<nowiki>#</nowiki>if *<nowiki>#</nowiki>elif *<nowiki>#</nowiki>else *<nowiki>#</nowiki>endif *<nowiki>#</nowiki>ifdef *<nowiki>#</nowiki>ifndef *<nowiki>#</nowiki>define *<nowiki>#</nowiki>undef :詳細は[[C マクロ]]に記述 *<nowiki>#</nowiki>pragma :詳細は[[C プラグマ]]に記述 == '''<nowiki>#</nowiki>include''' == <nowiki>#</nowiki>includeディレクティブでは、インクルードファイルを検索して読み込む処理を記述します。以下のような2とおりの記述ができます。 '''<nowiki>#</nowiki>include ”(パス\)インクルードファイル名”''' '''<nowiki>#</nowiki>include <nowiki><</nowiki>(パス\)インクルードファイル名<nowiki>></nowiki>''' " "2重引用符と<nowiki><</nowiki> <nowiki>></nowiki>山カッコ(小なり 大なり)の2とおりのファイルパス記述が#includeの命令の後ろに空白を挟んで記述することで指定できますが、それぞれはディレクトリの検索順序が異なります。" "2重引用符はプロジェクト固有のインクルードファイルを指定し、<nowiki><</nowiki> <nowiki>></nowiki>山カッコは標準関数やSDKなどの開発環境設定を優先するようなインクルードファイルを指定するために利用されます。 具体的には以下の優先順序になる。 '''” ”2重引用符''' :#<nowiki>#</nowiki>includeディレクティブが記述されたファイルの置かれているディレクトリ内、相対パスがある場合はファイルの置かれているディレクトリからの相対パス内。相対パスに関する扱いは以降も同じなので省略。 :#<nowiki>#</nowiki>includeディレクティブによって最後に開かれたファイルが優先されて使われ、ディレクトリの検索は読み込みをしたファイルが置かれている親ディレクトリ。なければ更に読み込みをしたファイルが更に#includeディレクティブによって読み込まれていたなら、読み込みをした親ディレクトリ(親の親)と遡っていく。 :#/I コンパイルオプションで指定されているディレクトリ :#環境変数INCLUDEで指定されたディレクトリ '''<nowiki><</nowiki> <nowiki>></nowiki>山カッコ''' :#/I コンパイルオプションで指定されているディレクトリ :#環境変数INCLUDEで指定されたディレクトリ incluedeファイルの入れ子は10レベルまでとなっているので、あまり階層(呼び出しの呼び出しの呼び出し…のような感じ)が深くならないようにディレクティブによるヘッダの呼び出しをするように組み込みましょう。絶対パスを指定した場合はその他のディレクトリは検索しないことになっていますので、次々と検索されるのを防ぐ必要がある場合には絶対パスが利用できます。但し、絶対パスにした場合、第三者にプログラムを再利用してもらう場合の配慮が必要になりますので、用途に応じた対応が必要になります。あえて絶対パスにして、自分以外のPCでは簡単にコンパイルされないようにする嫌がらせも可能です。原因がわからない人には使えないという試練を与えるドラマでいうところのなんだその変な胡散臭い試練はって奴になります。 マイクロソフト固有の処理としては、環境変数や/I オプションには;区切りで複数のパスを指定できるが、先頭に記述されているパスが優先されるというものです。 インクルードファイル名が重複する場合には、このあたりの優先度を理解してインクルードパスの指定をきっちりとしてやることが大事になってきます。 =='''<nowiki>#</nowiki>using'''== C++/CLIで使われる共通言語基盤のライブラリを読み込む場合に利用するものですので、説明を省略します。C++/CLIの項目で解説するかもしれません。 =='''<nowiki>#</nowiki>import'''== タイプライブラリ(.olb/.tlb/.dll/.ocx/.exe…)の読み込みを指示するディレクティブです。C++では、読み込んだタイプライブラリはC++のクラスとして展開されます。 利用方法は#includeによく似ています。 '''<nowiki>#</nowiki>import ”(パス\)タイプライブラリファイル名” (属性)''' '''<nowiki>#</nowiki>import <nowiki><</nowiki>(パス\)タイプライブラリファイル名<nowiki>></nowiki> (属性)''' のように指定します。タイプライブラリ名を指定した後ろに空白を設けて(属性)とあるように、さまざまなオプションとなるような属性を指定することもできます。属性についてはWinアプリの[[分散オブジェクト技術|分散モジュール]]のようなタイプライブラリを使っている分にはマイクロソフト固有のものしか付与しないと思います。詳細はMSDNの https://msdn.microsoft.com/ja-jp/library/298h7faa.aspx を参照して下さい。ファイルの検索の優先度は以下のとおりです。#includeによく似ていますが違っている部分もあるので、勘違いしないようにしましょう。COM/COM+オブジェクトではこのようなタイプライブラリに一意に決まるIDを付与しています。そのようなIDを利用する手法として(パス\)タイプライブラリファイル名の代わりにprogid:サフィックスではじまるタイプライブラリのコントロールのprogidを記述する手法として、progid:ライブラリ名.クラス名のような形式やlibid:サフィックスではじまるタイプライブラリのライブラリIDを記述する手法として、libid:2DF8D04C-5BFA-101B-BDE5-00AA0044DE52のような形式を使うことも出来ます。このようなタイプライブラリの使い方はマイクロソフトやその他企業が提供するものは巨大で複雑なものが多くここで簡単に説明できるような内容ではないためWinアプリの記事を書くときがあれば、記述しますが、ここではディレクティブの使い方だけを取り上げているため説明を省略します。 *一意に決まるIDはGUID(Global Unique Identifer)と呼ばれています。GUID生成アルゴリズムによって作成されたGUIDは西暦5770年まで、1秒間に1000万個のIDを発番しても重複しないIDとして保障されているため個人が発番しても、有名企業が発番しても重複しないIDになるため自由に生成アプリを使って発番できるようになっています。もちろん誰かが発番したIDを横取りすれば重複してしまうので、横取りをすることは何も良いことはありません。プログラムが併用できなくなるため、横取りされたプログラムの関係者やプログラムのユーザに迷惑をかけるだけの結果になります。 :*CLSID クラス識別子 :*DISPID ディスパッチ識別子 :*IID インターフェース識別子 :*ProgID(short for PROGrammatic IDentifier)日本語対応表現は不明もしくは存在しない。 OLEview.exeでタイプライブラリの情報を閲覧できます。 :OLEview.exeはC:\Program Files (x86)\Windows Kits\8.0\bin\x64にあります(VisualStudio2012の場合 ※インストールディレクトリによって異なる場合があります。)。 guidgen.exeでGUIDの生成が出来ます。 :guidgen.exeはC:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Toolsにあります(VisualStudio2012の場合 ※インストールディレクトリによって異なる場合があります。)。 '''” ”2重引用符''' :#<nowiki>#</nowiki>importディレクティブが記述されたファイルの置かれているディレクトリ内、相対パスがある場合はファイルの置かれているディレクトリからの相対パス内。相対パスに関する扱いは以降も同じなので省略。 :#<nowiki>#</nowiki>includeディレクティブによって最後に開かれたファイルが優先されて使われ、ディレクトリの検索は読み込みをしたファイルが置かれている親ディレクトリ。なければ更に読み込みをしたファイルが更に#includeディレクティブによって読み込まれていたなら、読み込みをした親ディレクトリ(親の親)と遡っていく。 :#/I コンパイルオプションで指定されているディレクトリ :#環境変数INCLUDEで指定されたディレクトリ '''<nowiki><</nowiki> <nowiki>></nowiki>山カッコ''' :#環境変数PATHで指定されたディレクトリ :#環境変数LIBで指定されたディレクトリ :#/I コンパイルオプションで指定されているディレクトリ、指定の無い場合は他の#import **** no_registryの属性をもった形式によって読み込まれたタイプライブラリが参照するライブラリを検索。※no_registry属性はタイプライブラリのレジストリを検索しないことを宣言する属性。 使用例 記述例ですので、以下のディレクティブが実際に使えるかどうかは保証しません。 <syntaxhighlight lang="cpp"> // XML #import "msxml6.dll" named_guids raw_interfaces_only #import "progid:msxml2.domdocument" raw_interfaces_only auto_rename // Office #import "libid:2DF8D04C-5BFA-101B-BDE5-00AA0044DE52" version("2.4") lcid("0") raw_interfaces_only auto_rename // Word #import "libid:00020813-0000-0000-C000-000000000046" version("1.6") lcid("0") raw_interfaces_only auto_rename </syntaxhighlight> =='''<nowiki>#</nowiki>line'''== __LINE__と__FILE__マクロの値を書き換えるディレクティブです。コンパイルエラー処理の際に表示するファイル名や行番号を入れ替えて、コンパイルエラーの根本の原因箇所が異なることを明示的に示すことに利用します。 =='''<nowiki>#</nowiki>error'''== =='''<nowiki>#</nowiki>if/<nowiki>#</nowiki>elif/<nowiki>#</nowiki>else/<nowiki>#</nowiki>endif'''== プリプロセッサの制御用構文です。プログラム内のif文とよく似ている制御構造を持つことが出来ますが、比較演算子に使われる変数はマクロとよばれる変数によってあらかじめ定義されていなければ、うまく比較することができないかったり、プログラム内と同等の複雑な比較演算はできないことが異なります。#ifはif、#elifはelse if、#elseはelseによく似ている働きに相当しますが、{ }による制御実行範囲の指定がないため、 制御構造の終端に#endifと記述する必要があり、#if~#endifの間に記述されているないようがプリプロセッサの制御構造となります。制御構造内にあれば#elifは何度でも利用できて、#else~#endifはどれにもあてはまらない場合の処理区間となます。#elifと#elseは必要なければ、省略することが可能です。 =='''<nowiki>#</nowiki>ifdef/<nowiki>#</nowiki>ifndef'''==
C ディレクティブ
に戻る。
個人用ツール
18.217.93.250
このIPアドレスのトーク
ログイン
名前空間
ページ
議論
変種
表示
閲覧
ソースを表示
履歴表示
操作
検索
案内
メインページ
コミュニティ・ポータル
最近の出来事
最近の更新
おまかせ表示
ヘルプ
ツールボックス
リンク元
関連ページの更新状況
特別ページ