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"传递给编译器,但我失去了希望.这与此问题有关,但增加了一个级别.
通过一些技巧,您可以在符合 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"作为预处理的结果。