区分(小)数字和C预处理器中的所有其他数字

时间:2015-10-10 23:56:32

标签: preprocessor c-preprocessor

我试图找出是否有办法在宏参数为(小)数时返回预先计算的值,并返回用于计算结果的代码,即。如果参数是变量/表达式。

我正在寻找最好的C预处理器解决方案 - 如果没有别的,因为我很好奇它是否可以完成 - 不是因为“宏是邪恶的,使用内联函数”,“编译器会不断折叠无论如何“或”使用另一个预处理器“。

到目前为止,我最好的想法是要求将宏的所有非常数参数括在括号中,即。 MACRO(2)MACRO((count)),因为可以检测参数是否是括号,但这只是稍微好一些(或者更糟,取决于观点)而不仅仅是 MACRO_CONSTMACRO

我的意思的一个例子,想要的计算是x+1

#define MACRO_1 2
#define MACRO_2 3
#define MACRO_VAR(ARG) ARG + 1
#define MACRO_CONST(ARG) MACRO_ ## ARG
#define MACRO(ARG) IF_IS_PAREN(ARG, MACRO_VAR, MACRO_CONST)(ARG)

#define TEST(...) .., ..
#define THIRD(A, B, C, ...) C
#define CALL(FUNC, ...) FUNC(__VA_ARGS__)
#define IF_IS_PAREN(COND, T, F) CALL(THIRD, TEST COND, T, F, ..)

MACRO(2); // results in 3;
MACRO((var)); // results in (var) + 1;
MACRO(("ab"[var])); // results in ("ab"[var]) + 1;

只有少量支持的常量值,因此检测每个常量扩展的单个宏是否有效,除了它会破坏无法粘贴的表达式以形成有效的预处理标记。

这方面的一个例子:

#define MACRO_1 .., 2
#define MACRO_2 .., 3
#define MACRO(ARG) CALL(SECOND, MACRO_ ## ARG, ARG + 1, ..)

#define SECOND(A, B, ...) B
#define CALL(FUNC, ...) FUNC(__VA_ARGS__)

MACRO(2); // results in 3;
MACRO(var); // results in var + 1;
MACRO("ab"[var]); // error

结合这两种方法,你可以使它只需要在不以[az]开头的情况下对表达式进行括号化,但至少可以说有时候必须使用括号表达式来混淆。

有没有办法让任意表达式的这种工作不需要用户跳过任何(或跳过更少)特殊的箍?如果没有,为什么?

0 个答案:

没有答案