引数xの値を出力するC言語マクロPRINT(x)の定義方法
本記事では、引数として渡された内容をそのまま出力するC言語マクロ PRINT(x) の定義方法を解説します。デバッグ時などに変数やリテラルの中身を手軽に確認できる、覚えておくと便利なテクニックです。
文字列化演算子「#」による実装
この課題を実現するには、プリプロセッサが提供する文字列化演算子(stringize operator)「#」を使用します。マクロ仮引数の直前に「#」を付けると、渡された実引数は自動的に文字列リテラルへと変換されます。そのため、内部で printf() 関数を呼び出すだけで、引数の内容をそのまま出力できます。それでは、具体例を見ていきましょう。
コード例
#include <stdio.h>
#define PRINT(x) printf(#x)
int main () {
PRINT(Hello);
printf("\n");
PRINT(26);
printf("\n");
PRINT(2.354721);
printf("\n");
return 0;
}実行結果
Hello 26 2.354721
動作の仕組み
#define PRINT(x) printf(#x) では、記号「#」によって引数が文字列化されるため、PRINT(Hello); はコンパイル前に printf("Hello"); へと展開されます。同様に PRINT(26); は printf("26"); となり、数値もそのまま文字列として出力されます。
ただし、このマクロが出力するのは「評価後の値」ではなく「引数として記述されたテキスト」である点には注意が必要です。たとえば変数名を渡した場合は、その変数名がそのまま表示されます。変数名と実際の値をセットで出力したいデバッグ用途には、次のようにフォーマット指定子と組み合わせる方法もあります。
#define PRINT_VALUE(x) printf(#x " = %d\n", x)
このように文字列化演算子を活用すれば、シンプルな1行マクロで柔軟な出力処理を実現できます。
-
C言語で配列を逆順に反転させるプログラムの書き方
配列とは、共通の名前のもとで管理される、関連性のあるデータ項目の集まりのことです。同じ型の複数の値を効率的に扱いたい場合に活用されます。配列の宣言構文C言語で配列を宣言する際の基本的な構文は以下のとおりです。データ型 配列名 [サイズ];配列の初期化配列は、宣言と同時に初期化することもできます。int a[5] = { 10,20,30,40,50};この例では、整数型の配列 a の5つの要素に、それぞれ10から50までの値が順番に格納されています。C言語で配列を逆順にする方法配列の要素を逆順に並べ替えるには、要素の入れ替え(スワップ)やコピーのテクニックを利用します。たとえば、4つの要素を持
-
【解決済み】HPプリンターが勝手にテストページを印刷する原因と12の対処法
HPプリンターが突然テストページを勝手に印刷し続けて困っていませんか?文書を印刷しようとしたのに、意図しないテストページが出力されると、作業の妨げになるだけでなく、インクや用紙の無駄にもなります。この記事では、その原因と効果的な解決策をわかりやすく解説します。症状が悪化する前に、ぜひ参考にしてください。HPプリンターが予期しないテストページを印刷する原因は?HPプリンターが警告なしに突然オフになったり、勝手にテストページを印刷したりするトラブルは少なくありません。このような現象により、ユーザーは文書の印刷・コピー・スキャンができなくなります。主な原因としては、電力供給の低下やプリンターの電源オ