在定义中将#a字符串化,为什么不好

use*_*743 5 c printf c-preprocessor

#include <stdio.h>
#define print_int(a) printf("%s : %d\n",#a,(a))
int main(void) {
    int y = 10;
    print_int(y);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我正在上课,并被要求解释为什么这很糟糕。所以我想字符串化#a是问题。它确实有效,那么为什么会有危险呢?

Ena*_*ane 3

因为它绕过了类型安全。当有人讨厌你并离开时会发生什么print_int("5412");

\n\n
#include <stdio.h>\n#define print_int(a) printf("%s : %d\\n",#a,(a))\nint main(void) {\n    print_int("1123123");\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出

\n\n
$ gcc test.c \ntest.c: In function \xe2\x80\x98main\xe2\x80\x99:\ntest.c:4: warning: format \xe2\x80\x98%d\xe2\x80\x99 expects type \xe2\x80\x98int\xe2\x80\x99, but argument 3 has type \xe2\x80\x98char *\xe2\x80\x99\n$ ./a.out \n"1123123" : 3870\n
Run Code Online (Sandbox Code Playgroud)\n