给定3个双精度值x,y和z,我会进行很多这样的printf调用:
printf("[%+-8.3lf, %+-8.3lf, %+-8.3lf]\n", x, y, z);
然后,我希望有一个某种类型的宏来编写如下内容:
#define FORMAT(x,y) "+-x.ylf"
printf("[%FORMAT(8,3), %FORMAT(8,3), %FORMAT(8,3)]\n", a->x, a->y, a->z);
但是当然,编译器把%F看作一个特殊的字符串,并且没有把我的宏放到字符串里面。有什么方法可以达到我想要的效果吗?
2条答案
按热度按时间bnl4lu3b1#
使用简单数字作为
FORMAT
的参数您的“类似这样的东西”代码很接近--但是您需要使用字符串连接(相邻字符串的文字)和
#
操作符来“字符串化”宏参数:这类似于使用
<inttypes.h>
中的宏来打印int64_t
之类的类型,不同之处在于,您必须提供%
符号(以及任何标志):使用宏作为FORMAT的参数
有没有办法把8和3也定义为宏呢?比如,我不想到处写
FORMAT(8,3)
,我想把FORMAT(X, Y)
写在我上面定义的#define X 8
和#define Y 3
上。是的,有一种方法可以做到这一点。引入一个额外的宏:
并在
FORMAT
的参数上调用该函数,如下所示:这将运行并生成以下输出:
它演示了可以使用简单数字或Map到简单数字的宏作为
FORMAT
宏的参数,但不能使用#define Y 3
和#define X (Y + 6)
-这将字符串化在printf()
转换规范中无效的(3 + 6)
。你可以在你的数字和下面的逗号之间加上空格。用#define X 12
来实验一下,看看我的意思。)调用另一个宏的技术会触发参数的扩展,这通常是您想要的。请参见How to make a char string from a C macro's value?和Macro directives in C — my code example doesn't work。How can I concatenate twice with the C preprocessor and expand a macro as in "
arg ## _ ## MACRO
"?的问答是关于标记串联而不是字符串化的,但问题是密切相关的,解决方案也是相似的。q7solyqu2#
您可以将宏调整为类似于:
并调用
printf
:将
%
放在宏中也可能是一个好主意。单个散列(#),* 将 * x和y参数“转换”为字符串常量。
Example