c - C 中的符号常量(#define 语句)

标签 c

在阅读了一些 K&R 的 C 编程语言之后,我遇到了#define 符号常量。我决定定义...

#define INTEGER_EXAMPLE 2
#define CHAR_EXAMPLE 2

...所以我的问题是 C 如何知道我定义的是 int 还是 char 类型?

最佳答案

#define-d 名称没有类型。他们只是定义文本替换。

编译器看到的是预处理后的形式。如果使用 GCC,请尝试 gcc -C -E somesource.c 并查看(预处理的)输出。

在 1980 年代,预处理器是一个单独的程序。

了解 cpp预处理器,和 preprocessorC preprocessor维基页面。

你甚至可以定义不明确的名字,比如

#define BAD @*?$ some crap $?

更可怕的是你可以定义语法不完整的东西,比如

#define BADTASTE 2 +

及以后的代码 BADTASTE 3

实际上,您希望在定义宏时使用括号。如果你有

#define BADPROD(x,y) x*y

然后 BADPROD(2+3,4+5) 被扩展为 2+3*4+5 编译器理解为 2+ (3 *4) +5;你真的想要

#define BETTERPROD(x,y) ((x)*(y))

因此 BETTERPROD(2+3,4+5) 被扩展为 ((2+3)*(4+5))

避免宏参数中的副作用,例如BETTERPROD(j++,j--)

一般来说,谨慎使用宏并让它们保持简单。

关于c - C 中的符号常量(#define 语句),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19379353/

相关文章:

c - 如何检查 c 中 fscanf 的行为?

c - free() 函数在几次 memmove 后导致崩溃

c - mxGPU GetDimensions 返回一个数组,其中维度大小之间为零

c - 我怎样才能按这个顺序执行3个线程呢?

c - 关于c点,无法理解输出

c - 嵌套单链表

c - "volatile const int a"与 "const volatile int a"?

c - C编程中,要求L值是语义错误还是语法错误?

c - 如何在 C 中处理复数?

c - (C 编程) 如何使用在另一个文件中定义的数据结构和函数?