如何将宏作为宏的操作结果进行字符串化?

nmi*_*els 7 c string macros c-preprocessor

这是一个说明我的问题的程序:

#include <stdio.h>

#define NUMERATOR 8
#define DENOMINATOR 2
#define QUOTIENT (NUMERATOR / DENOMINATOR)

#define ZSTR(x) XSTR(#x)
#define YSTR(x) XSTR(x)
#define XSTR(x) STR(x)
#define STR(x) #x

int main()
{
    printf("QUOTIENT:       %d\n", QUOTIENT);
    printf("STR(QUOTIENT):  %s\n", STR(QUOTIENT));
    printf("XSTR(QUOTIENT): %s\n", XSTR(QUOTIENT));
    printf("YSTR(QUOTIENT): %s\n", YSTR(QUOTIENT));
    printf("ZSTR(QUOTIENT): %s\n", ZSTR(QUOTIENT));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是它的输出:

$ gcc -g -Wall -o stringify stringify.c && ./stringify 
QUOTIENT:       4
STR(QUOTIENT):  QUOTIENT
XSTR(QUOTIENT): (8 / 2)
YSTR(QUOTIENT): (8 / 2)
ZSTR(QUOTIENT): "QUOTIENT"
Run Code Online (Sandbox Code Playgroud)

我想将一个字符串文字"4"传递给编译器,但我失去了希望.这与此问题有关,但增加了一个级别.

Jen*_*edt 3

通过一些技巧,您可以在符合 C99 的预处理器中实现基本算术。P99实现十进制数的算术和逻辑。例如

P99_IF_GT(1,0)(true)(false)
P99_ADD(3, 7)
P99_MUL(7, 2)
P99_DIV(7, 2)
Run Code Online (Sandbox Code Playgroud)

会被预处理成类似的东西

1
10
14
3
Run Code Online (Sandbox Code Playgroud)

这些宏可以进一步处理、字符串化以及您喜欢的任何内容。

P99_STRINGIFY(P99_PASTE2(XXX_, P99_ADD(3, 7)))
Run Code Online (Sandbox Code Playgroud)

导致"XXX_10"作为预处理的结果。