如何让预处理器进行串联算术运算?
我尝试过:
#define DECL_FUNCT3(ch1, ch2) \
void funct_ ## ch1 ## _and_ ## ch2 ## _(void);
#define DECL_FUNCT2(ch1, ch2) DECL_FUNCT3(ch1, ch2)
#define DECL_FUNCT1(ch1, ch2) DECL_FUNCT2(ch1, ch2)
#define DECL_FUNCT(ch) DECL_FUNCT1(ch, ch+16)
DECL_FUNCT(0)
DECL_FUNCT(1)
我想得到:
void funct_0_and_16_(void);
void funct_1_and_17_(void);
但我得到的是:
$ gcc -E test.c
[...]
void funct_0_and_0+16_(void);
void funct_1_and_1+16_(void);
是否可以?
If ch
介于 0 到 240 之间,您可以使用BOOST_PP_ADD https://www.boost.org/doc/libs/1_72_0/libs/preprocessor/doc/ref/add.html来自boost预处理器库 https://www.boost.org/doc/libs/1_72_0/libs/preprocessor/为了那个原因:
#include <boost/preprocessor/arithmetic/add.hpp>
#define DECL_FUNCT3(ch1, ch2) \
void funct_ ## ch1 ## _and_ ## ch2 ## _(void);
#define DECL_FUNCT2(ch1, ch2) DECL_FUNCT3(ch1, ch2)
#define DECL_FUNCT1(ch1, ch2) DECL_FUNCT2(ch1, ch2)
#define DECL_FUNCT(ch) DECL_FUNCT1(ch, BOOST_PP_ADD(ch,16))
DECL_FUNCT(0)
DECL_FUNCT(240)
Godbolt 演示(使用 C++,但也应该适用于 C):
https://godbolt.org/z/2edrua https://godbolt.org/z/2edrua(这定义了空函数,而不是声明它们以获得一些可见的汇编输出)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)