在阅读了K&R的C语言编程语言之后,我遇到了#define符号常量.我决定定义......
#define INTEGER_EXAMPLE 2
#define CHAR_EXAMPLE 2
Run Code Online (Sandbox Code Playgroud)
...所以我的问题是C如何知道我是在定义int还是char类型?
#define-d名称没有类型.他们只是定义文本替换.
编译器看到的是预处理的表单.如果使用GCC,请尝试gcc -C -E somesource.c查看(预处理)输出.
在20世纪80年代,预处理器是一个单独的程序.
阅读有关cpp预处理器,预处理器和C预处理器 wikipages的信息.
您甚至可以定义不明确的名称
#define BAD @*?$ some crap $?
Run Code Online (Sandbox Code Playgroud)
甚至更可怕的是你可以定义语法上不完整的东西
#define BADTASTE 2 +
Run Code Online (Sandbox Code Playgroud)
以及后来的代码 BADTASTE 3
实际上,您希望在定义宏时使用括号.如果你有
#define BADPROD(x,y) x*y
Run Code Online (Sandbox Code Playgroud)
然后BADPROD(2+3,4+5)扩展到2+3*4+5编译器理解的范围2+ (3*4) +5; 你真的想要
#define BETTERPROD(x,y) ((x)*(y))
Run Code Online (Sandbox Code Playgroud)
所以这BETTERPROD(2+3,4+5)扩展到了((2+3)*(4+5))
避免在宏参数中产生副作用,例如 BETTERPROD(j++,j--)
通常,小心使用宏并让它们保持简单.
关于这些定义,它没有,扩展的宏没有类型。处理 #define 的预处理器只是替换源代码中的文本
当您在某处使用这些定义时,例如
int i = INTEGER_EXAMPLE;
Run Code Online (Sandbox Code Playgroud)
这将扩展到
int i = 2;
Run Code Online (Sandbox Code Playgroud)
这里,文字 2(在本上下文中是 int)被分配给 int。
你还可以这样做:
char c = INTEGER_EXAMPLE;
Run Code Online (Sandbox Code Playgroud)
在这里,文字 2 也是一个 int,并且它被分配给一个 char。2 虽然在 char 的范围内,所以一切都可以。
你甚至可以这样做:
int INTEGER_EXAMPLE = 2;
Run Code Online (Sandbox Code Playgroud)
这将扩展到
int 2 = 2;
Run Code Online (Sandbox Code Playgroud)
这是无效的 C.