宏执行整数运算

时间:2017-04-20 07:49:54

标签: c macros c-preprocessor

是否可以使用宏执行算术(我的情况下的乘法)?

我理解写一个像:

的宏
#define mult(a,b) ((a)*(b))

将随处替代产品。但我有两个参数作为常量。我知道编译器也会静态执行乘法,但问题是我必须使用#将结果转换为字符串。

知道如何做到这一点吗?

此外,如果可以使用C ++宏完成,我仍然可以。我可以用C ++编写那些特定的模块并将其链接起来。

以下是我目前的代码

#define ARG_COPY()      __asm__("subq   $8, %rsp"); \
                        __asm__("movq   %gs:0xe8, %r10"); \
                        __asm__("movq   $16, %r11"); \
                        __asm__("1:"); \
                        __asm__("movq   -8(%r10, %r11, 8), %rax"); \
                        __asm__("pushq  %rax"); \
                        __asm__("decq   %r11"); \
                        __asm__("jne    1b"); \

#define ARG_REMOVE()    __asm__("add    $136, %rsp"); 

现在上面的代码是在没有参数的情况下编写的 - 136是16 * 8 + 8.我想将16作为参数。在第一个宏中也使用了相同的16。

2 个答案:

答案 0 :(得分:4)

没有。 C预处理器纯粹在令牌上运行(通过将一个令牌序列替换为另一个令牌序列)。它之间没有算术。

你必须为此编写自己的预处理器。或者如何使用产品字符串创建头文件,并在需要的地方#including它?另一种可能性:不要打扰;如果它不是真正的性能瓶颈,请使用sprintf(s, "%d", mult(a,b));。也许某些编译器 足够聪明,可以在编译时对此进行评估。

您有多少常量产品字符串?有多少是不同的?

答案 1 :(得分:1)

是否可以使用宏执行算术运算(乘法运算)?

Yes,给定您指定的限制(您使用常量;特别是十进制文字),并有限制。链接到代码显示ADD和MUL宏,它就是这样做的(它有点太大而不能粘贴内联)。要使用预处理器宏本身执行此操作,需要“实现算术”。此示例仅支持1到255之间的数字,并且要求符合C99的预处理器支持511参数。

Boost preprocessor library还包含宏算术的实现;并且代码支持DIV和SUB。