C ディレクティブ 新しいページはコチラ
提供: yonewiki
(→#error) |
(→#include) |
||
1行: | 1行: | ||
+ | [[C PlusPlus#Cにもあった技術|C++]]へ戻る | ||
+ | |||
+ | |||
※このページではC言語にも存在していたという意味で記事タイトルがC ディレクティブになっていますが、<br /> | ※このページではC言語にも存在していたという意味で記事タイトルがC ディレクティブになっていますが、<br /> | ||
[[C PlusPlus|C++]]でも同様です。[[C PlusPlus|C++]]だけの機能がある場合は明記します。<br /> | [[C PlusPlus|C++]]でも同様です。[[C PlusPlus|C++]]だけの機能がある場合は明記します。<br /> | ||
<br /> | <br /> | ||
− | + | <big><big>'''ディレクティブ'''</big></big> | |
+ | |||
+ | |||
ディレクティブとは日本語で指示するという意味でDirectiveは映画やドラマのDirectorでも同じような意味で制作指揮者・監督というような意味で使われます。プリプロセスを指示するための命令文がディレクティブであることについては[[C プリプロセッサ]]の項目で記述しました。 | ディレクティブとは日本語で指示するという意味でDirectiveは映画やドラマのDirectorでも同じような意味で制作指揮者・監督というような意味で使われます。プリプロセスを指示するための命令文がディレクティブであることについては[[C プリプロセッサ]]の項目で記述しました。 | ||
35行: | 40行: | ||
*<nowiki>#</nowiki>pragma | *<nowiki>#</nowiki>pragma | ||
:詳細は[[C プラグマ]]に記述 | :詳細は[[C プラグマ]]に記述 | ||
+ | |||
+ | |||
== '''<nowiki>#</nowiki>include''' == | == '''<nowiki>#</nowiki>include''' == | ||
+ | |||
<nowiki>#</nowiki>includeディレクティブでは、インクルードファイルを検索して読み込む処理を記述します。以下のような2とおりの記述ができます。 | <nowiki>#</nowiki>includeディレクティブでは、インクルードファイルを検索して読み込む処理を記述します。以下のような2とおりの記述ができます。 | ||
48行: | 56行: | ||
具体的には以下の優先順序になる。 | 具体的には以下の優先順序になる。 | ||
+ | |||
+ | |||
+ | |||
62行: | 73行: | ||
− | + | よく使われていたインクルードの宣言は#include <stdio.h>で、C++11という標準規格が制定された2011年くらいまでは、この方法でした。C++11以降はstdioに変わる新しいヘッダファイルcstdioに置き換わっています。VisualStudio2012あたりからcstdioが使われ始めています。他にも主要なヘッダファイルは先頭にcがついて、後ろの.hがないヘッダファイルに置き換わっています。VisualStudio2019ではC++20までの標準規格規格に対応しつつあり、メニュー{デバッグ}>{(プロジェクト名)のデバッグ}で表示されるダイアログの左側ツリーから全般を選択したときに表示される{言語の標準規格の設定}でどの規格を使うかが設定できます。既定ではC++14になっています。C++14の設定でもC++17やC++20の一部の機能は使えます。つまり、VS2019ではもうとっくにC++11準拠なので、cstdioを使った方が良いという感じです。他のコンパイラでもそろそろ、cstdioが対応されていると思います。 | |
+ | |||
+ | |||
+ | 標準ヘッダファイルが新しくなったモノ一覧 | ||
+ | *<cassert> | ||
+ | *<ccomplex> | ||
+ | *<cctype> | ||
+ | *<cerrno> | ||
+ | *<cfenv> | ||
+ | *<cfloat> | ||
+ | *<cinttypes> | ||
+ | *<ciso646> | ||
+ | *<climits> | ||
+ | *<clocale> | ||
+ | *<cmath> | ||
+ | *<csetjmp> | ||
+ | *<csignal> | ||
+ | *<cstdalign> | ||
+ | *<cstdarg> | ||
+ | *<cstdbool> | ||
+ | *<cstddef> | ||
+ | *<cstdint> | ||
+ | *<'''cstdio'''> | ||
+ | *<cstdlib> | ||
+ | *<cstring> | ||
+ | *<ctgmath> | ||
+ | *<ctime> | ||
+ | *<cuchar> | ||
+ | *<cwchar> | ||
+ | *<cwctype> | ||
+ | |||
+ | |||
+ | incluedeファイルの入れ子は10レベルまでとなっているので、あまり階層(呼び出しの呼び出しの呼び出し…のような感じ)が深くならないようにディレクティブによるヘッダの呼び出しをするように組み込みましょう。絶対パスを指定した場合はその他のディレクトリは検索しないことになっていますので、次々と検索されるのを防ぐ必要がある場合には絶対パスが利用できます。但し、絶対パスにした場合、第三者にプログラムを再利用してもらう場合の配慮が必要になりますので、用途に応じた対応が必要になります。あえて絶対パスにして、自分以外のPCでは簡単にコンパイルされないようにする嫌がらせも可能です。原因がわからない人には使えないという試練を与えるドラマでいうところのなんだその変な胡散臭い試練はって奴になります。 | ||
69行: | 112行: | ||
インクルードファイル名が重複する場合には、このあたりの優先度を理解してインクルードパスの指定をきっちりとしてやることが大事になってきます。 | インクルードファイル名が重複する場合には、このあたりの優先度を理解してインクルードパスの指定をきっちりとしてやることが大事になってきます。 | ||
− | |||
=='''<nowiki>#</nowiki>using'''== | =='''<nowiki>#</nowiki>using'''== | ||
166行: | 208行: | ||
− | + | プリプロセッサ演算子のdefined()を比較演算子の結果として利用することができるため | |
+ | <syntaxhighlight lang="cpp"> | ||
+ | #define __MYDIRECTIVE_MACRO__ | ||
+ | |||
+ | … | ||
+ | |||
+ | |||
+ | #if defined(__MYDIRECTIVE_MACRO__) | ||
+ | f = 1; | ||
+ | #else | ||
+ | f = 0; | ||
+ | #endif | ||
+ | </syntaxhighlight> | ||
+ | のように__MYDIRECTIVE_MACRO__というマクロが定義されているかどうかを判定するプリプロセッサ演算子を比較演算子に使うことができます。そのほかの比較演算子としては >=、<=、>、<、==、!= が利用できます。#ifディレクディブの後に続く部分に条件を記述しますが、条件としての比較演算子の演算結果が0なら偽:falseであり、それ以外なら真:trueとなります。条件は比較演算子以外にもマクロの値そのものでも良いです。 #if defined(__MYDIRECTIVE_MACRO__)を#ifdef __MYDIRECTIVE_MACRO__と書き換えることのできる#ifdefディレクティブや#ifndefディレクティブも存在します。 | ||
+ | |||
+ | |||
+ | この項目の記事はマクロについて理解していないと、わからないと思いますので、さらにマクロについての理解を深めることをお勧めします。 | ||
=='''<nowiki>#</nowiki>ifdef/<nowiki>#</nowiki>ifndef'''== | =='''<nowiki>#</nowiki>ifdef/<nowiki>#</nowiki>ifndef'''== | ||
+ | <nowiki>#</nowiki>ifdefディレクティブや#ifndefディレクティブは#ifディレクティブの利用方法の一部の記述を簡略化するためのディレクティブです。 | ||
+ | <syntaxhighlight lang="text"> | ||
+ | #ifdef __MYDIRECTIVE_MACRO__ | ||
+ | ~ | ||
+ | #endif | ||
+ | </syntaxhighlight> | ||
+ | と記述した場合 | ||
− | + | ||
+ | <syntaxhighlight lang="text"> | ||
+ | #if defined(__MYDIRECTIVE_MACRO__) | ||
+ | ~ | ||
+ | #endif | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | と同等の記述をしたことになります。#ifディレクティブやdefined()ディレクティブ演算子の動作内容については#ifの説明をした項目を参照して下さい。 | ||
+ | |||
+ | |||
+ | <nowiki>#</nowiki>ifndefはif nof defineを省略した意味を持っていて、 | ||
+ | |||
+ | <syntaxhighlight lang="text"> | ||
+ | #ifndef __MYDIRECTIVE_MACRO__ | ||
+ | ~ | ||
+ | #endif | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | と記述した場合 | ||
+ | |||
+ | <syntaxhighlight lang="text"> | ||
+ | #if defined(__MYDIRECTIVE_MACRO__) | ||
+ | #else | ||
+ | ~ | ||
+ | #endif | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | という具合の#elseディレクティブの範囲の事象だけ実行する範囲として制御できます。もちろん、#ifndefの後に#elseを使うことは出来て、マクロが定義されている場合の制御構文についても記載できます。 | ||
+ | |||
+ | <syntaxhighlight lang="text"> | ||
+ | #ifndef __MYDIRECTIVE_MACRO__ | ||
+ | |||
+ | ~ ※__MYDIRECTIVE_MACRO__ というマクロが定義されていない場合の処理 | ||
+ | |||
+ | #else | ||
+ | |||
+ | ~ ※__MYDIRECTIVE_MACRO__ というマクロが定義されている場合の処理 | ||
+ | |||
+ | #endif | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | <nowiki>#</nowiki>ifディレクティブの使い方とdefinedディレクティブ演算子とマクロの使い方を理解していないとこの項目は理解できないと思います。 | ||
+ | |||
+ | |||
+ | =='''<nowiki>#</nowiki>define/<nowiki>#</nowiki>undef'''== | ||
+ | *[[C マクロ##define|#define]] | ||
+ | *[[C マクロ##undef|#undef]] | ||
+ | |||
+ | 詳細な説明は上記の個別記事の項目を参照して下さい。 | ||
+ | |||
+ | =='''<nowiki>#</nowiki>pragma'''== | ||
+ | *[[C プラグマ##pragma|#pragma]] | ||
+ | |||
+ | 詳細な説明は上記の個別記事の項目を参照して下さい。 | ||
+ | |||
+ | |||
+ | [[C PlusPlus#Cにもあった技術|C++]]へ戻る |