#pragma / #error / #warning
| 対応: | #pragma / #error | C89(1989) |
|---|---|---|
| #warning | C23(2023) |
プリプロセッサの補助的な命令です。『#pragma』はコンパイラ固有の動作を制御し、『#error』はコンパイルを強制中断してメッセージを表示します。『#warning』は警告メッセージを出力します。
構文
// コンパイラ固有の制御を行います(コンパイラによって動作が異なります)。 #pragma 命令 // 二重インクルード防止の簡潔な記法です(多くのコンパイラがサポート)。 #pragma once // コンパイルを強制停止してエラーメッセージを表示します。 #error エラーメッセージ // 警告メッセージを表示します(GCC / Clang などでサポート)。 #warning 警告メッセージ // 構造体のパディングを制御します(移植性に注意)。 #pragma pack(n) // n バイト境界でアライメントします。 #pragma pack() // デフォルト設定に戻します。
主な命令一覧
| 命令 | 概要 |
|---|---|
| #pragma once | そのヘッダファイルを1度だけインクルードすることをコンパイラに指示します。多くのコンパイラで対応していますが、C標準ではありません。 |
| #pragma pack(n) | 構造体のメンバアライメントをnバイト境界に設定します。ネットワークプロトコルや外部バイナリ形式と構造体を合わせる際に使います。 |
| #pragma warning | 特定の警告を有効化・無効化します(Visual C++ などでサポート)。 |
| #error | プリプロセッサ段階でコンパイルを中断し、指定したメッセージをエラーとして表示します。 |
| #warning | プリプロセッサ段階で警告メッセージを表示します。コンパイルは継続されます。GCC・Clangでサポートされています。 |
サンプルコード
myheader.h
myheader.h の例です。
#pragma once
#define MY_HEADER_DEFINED
/* C99 以降が必要な場合の強制チェック */
#if __STDC_VERSION__ < 199901L
#error "このコードはC99以降が必要です。"
#endif
pragma_pack_example.c
pragma_pack_example.c の例です。
#include <stdio.h>
/* ネットワークパケット構造体(パディングなし)。 */
#pragma pack(1)
typedef struct {
unsigned char type;
unsigned short length;
unsigned int data;
} PacketHeader;
#pragma pack()
/* パディングありの場合と比較します。 */
typedef struct {
unsigned char type;
unsigned short length;
unsigned int data;
} PacketHeaderPadded;
int main(void) {
printf("pack(1) のサイズ: %zu バイト\n", sizeof(PacketHeader));
printf("通常のサイズ: %zu バイト\n", sizeof(PacketHeaderPadded));
return 0;
}
コンパイルして実行すると次のようになります。
gcc pragma_pack_example.c -o pragma_pack_example ./pragma_pack_example pack(1) のサイズ: 7 バイト 通常のサイズ: 8 バイト