知らない演算子があったとは

『独習C』第3版を立ち読みしていて発見。
#include<stdio.h>
#define QUOTE(s) puts(#s)
int
main(int argc, char *argv[])
{
QUOTE(Hello World); /* puts("Hello World") */
QUOTE(Hello World); /* puts("Hello World") */
QUOTE(Hello+World); /* puts("Hello+World") */
QUOTE("Hello\World"); /* puts("\"Hello\\World\"") */
exit(0);
}Hello World Hello World Hello+World "Hello\World"
- #演算子
- 形式:#op1
関数形式マクロの置換の並びにおいて、実引数を通常文字列リテラル化する。前後の空白は削除、連続する空白は1個の空白になる。"と¥は直前に¥が挿入される。
参考:平林雅英『新ANSI C言語辞典』
#include<stdio.h>
#define OP(i) op##i
int
main(int argc, char *argv[])
{
int op1 = 10;
int op2 = 25;
printf("%d\n", (OP(1) - OP(2))); /* op1 - op2 */
printf("%d\n", (OP(2) - OP(1))); /* op2 - op1 */
exit(0);
}-15 15
- ##
- 形式:op1##op2
置換の並びにおいて、前処理字句を連結する。
参考:平林雅英『新ANSI C言語辞典』
##はもう少し複雑な構造で使って、初めて効果が分かるかも。