プロが教える店舗&オフィスのセキュリティ対策術

下記のprintf()文で、#xの書式はどの様な意味になるのでしょうか?

#include <stdio.h>
#define PRINT(x) printf(#x":%x\n", x);
int main(int argc, const char * argv[]) {
 PRINT(0);
 PRINT(NULL);
 PRINT('\0');
 PRINT("");
 return 0;
}

質問者からの補足コメント

  • 0:0
    NULL:0
    '\0':0
    "":3f91
    になります。

    No.1の回答に寄せられた補足コメントです。 補足日時:2022/03/13 20:47

A 回答 (6件)

文字列化演算子…というらしい。


http://wisdom.sakura.ne.jp/programming/c/c42.html

使ったことはないですなぁ……。
    • good
    • 0

NULL の例にあるように, マクロの引数を「展開せずに」文字列化する, ってのがポイントだね. 展開した結果を文字列化したいならもう 1回マクロをかまさないといけないってのが意外と落とし穴かも.



プリプロセッサメタプログラミングで使うのがふつうかなと思って
https://oshiete.goo.ne.jp/qa/12843188.html
にちょいと例を書いてみた>#2. 今ではプリプロセッサに頼るよりもコードを自動生成する方が流行りなのかもしれん.
    • good
    • 1

No3です。


補足です。

 PRINT(NULL); → printf("NULL:%x",NULL)
 PRINT("");  → printf(":%x","");

に関しては、No4さんの回答とおり、規格上未定義動作ですね。

私の使っているCコンパイラではこうなっている
という参考情報として理解してください。
    • good
    • 0

ここの # は引数 (今の例では x) を文字列化するってだけ. もちろん「C の文法上『不適切』にならないように」文字列化するんだけど.



例えば
PRINT(0)
だと x が「0」だからそれを文字列にするので「"0"」になる. ここで生じる「"0"」ともともとマクロの中にある「":%x\n"」が結合されるので, プリプロセスをしたあとでは
printf("0:%x\n", 0)
と書いたのと同じことになる.

なお PRINT(NULL) と PRINT("") は規格上未定義動作になるのでこのプログラムは ill-formed.
    • good
    • 0

Cのプリプロセッサにより、


 PRINT(0); → printf("0:%x",0)
 PRINT(NULL); → printf("NULL:%x",NULL)
 PRINT('\0'); → printf("'\0':%x",'\0')
 PRINT("");  → printf(":%x","");
に翻訳されてコンパイルされます。
    • good
    • 0

printfの中味が間違っているようなきがする。


答えは0ですよね?
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!