| 関数形式マクロでの引数省略 |
関数形式マクロでは、引数の省略も可能。
その場合、マクロ呼び出しでの実引数の数は、
マクロ定義内の省略記号(...)を除く仮引数の数よりも
多くなければならない。
識別子__VA_ARGS__が省略された引数を表す。
__VA_ARGS__は、仮引数に省略記号を用いる関数形式マクロの
置換要素並びの中だけで使用可能。
例:
/*
ex_define_va.c
*/
#include <stdio.h> /* printf */
#include <stdlib.h> /* EXIT_SUCCESS */
#define DBG(...) (fprintf(stderr, __VA_ARGS__))
int main(int argc, char *argv[])
{
int x = 100;
DBG(”x:%d\n”, x);
return EXIT_SUCCESS;
}
|
2010年3月18日(木) 07:18 [ C言語 ]
この記事のURL / / |
| マクロの再定義の実験 |
マクロの再定義を実験してみた。
自分の環境では、
再定義可能のパターンではコンパイルがとおり、
再定義不可のパターンでは、warning: "OBJ_LIKE" redefined 等のワーニングが出た。
以下、プログラム。(表示都合上全角)
/*
define_test.c
*/
#include <stdio.h> /* printf */
#include <stdlib.h> /* EXIT_SUCCESS */
#define OBJ_LIKE (1−1)
#define FUNC_LIKE(a) ( a )
int main(int argc, char *argv[])
{
#define OBJ_LIKE /* コメント */ (1−1) /* コメント */
// #define OBJ_LIKE (0) // 字句の並びが違う
// #define OBJ_LIKE (1 − 1) // 空白類が違う
#define FUNC_LIKE( a ) ( /* 空白類に注意 */ \
a /* 一部が別の行
*/ )
// #define FUNC_LIKE(a) ( ’a’ ) // 仮引数の使用法が違う
// #define FUNC_LIKE(b) ( b ) // 仮引数のつづりが違う
printf(”%d\n”, FUNC_LIKE(OBJ_LIKE));
return EXIT_SUCCESS;
}
|
2010年3月18日(木) 06:47 [ C言語 ]
この記事のURL / / |