C预处理器定义具有多个替换的指令


/*
* Recommended alloc parameters for "small" contexts that are never expected
* to contain much data (for example, a context to contain a query plan).
*/
#define ALLOCSET_SMALL_MINSIZE   0
#define ALLOCSET_SMALL_INITSIZE  (1 * 1024)
#define ALLOCSET_SMALL_MAXSIZE   (8 * 1024)
#define ALLOCSET_SMALL_SIZES 
ALLOCSET_SMALL_MINSIZE, ALLOCSET_SMALL_INITSIZE, ALLOCSET_SMALL_MAXSIZE

我不明白上一个marco,我用

printf("%d", ALLOCSET_SMALL_SIZES);

然后警告:

warning: too many arguments for format [-Wformat-extra-args]

,也返回0。

类似的帖子我发现:#定义指令与多个替换?


更新:跳跃源代码,得到它。
类似

的函数
foo(size_t,size_t,size_t)

可以直接用

foo(ALLOCSET_DEFAULT_SIZES)

给定以下代码片段:

#define ALLOCSET_SMALL_SIZES 
ALLOCSET_SMALL_MINSIZE, ALLOCSET_SMALL_INITSIZE, ALLOCSET_SMALL_MAXSIZE

ALLOCSET_SMALL_SIZES被替换为:

ALLOCSET_SMALL_MINSIZE, ALLOCSET_SMALL_INITSIZE, ALLOCSET_SMALL_MAXSIZE

被替换为:

0,
(1 * 1024),
(8 * 1024)

是单独的参数。然后在对printf ()的调用中:

printf("%d", ALLOCSET_SMALL_SIZES);

ALLOCSET_SMALL_SIZES0, (1 * 1024), (8 * 1024)取代

printf ("%d", 0, (1 * 1024), (8 * 1024));

因此发出警告。


修复:

替换为:

printf ("%d %d %d", 0, (1 * 1024), (8 * 1024));

参见:为什么在C中使用宏?C宏有什么用?

最新更新