【发布时间】:2020-11-29 21:21:38
【问题描述】:
当你声明一个指向 int 的指针时:
int *a, b;
a 是指向 int 的指针,而 b 是 int (我从来没有真正理解为什么会发生这种情况,我知道与逗号有关,但我曾经说过星号是分箱的到变量名而不是数据类型)。无论如何,如果你:
#define intptr int*
intptr a, b
结果是一样的。我觉得奇怪的事实是为什么使用typedef 来做同样的事情会改变行为?
typdef int* intptr
intptr a, b;
在最后一个示例中,我期望 a 是 int*,而 b 是 int。相反,它们都是int*
为了澄清,有以下代码 sn-p 我不明白为什么我没有得到 d 变量的相同警告
#define intptr_def int*
typedef int* intptr_typ;
int main()
{
int x;
intptr_def a, b;
intptr_typ c, d;
a = &x;
b = &x; // Warning assignment to 'int' from 'int *' makes integer from pointer without a cast
c = &x;
d = &x;
return 0;
}
【问题讨论】:
-
typedef 与宏不同。 typedef 为类型提供别名。宏进行文本替换。如果您仔细研究该标准(C11 §6.7 Declarations — 一个长部分),您会看到一个声明有两个部分——指定基本类型的“声明说明符”(
int等,但也没有指针或修饰符的修饰符)数组或函数类型),以及“init-declarator list”,其中包含以逗号分隔的各个声明符列表。声明器包括指针、数组和函数类型的装饰。 -
尝试在宏中的
int和*之间添加一个空格(即#define intptr int *),然后“扩展”声明:它扩展为int *a, b;,这就是您之前所拥有的。 -
@Someprogrammerdude:
int和*之间的空间无关紧要——不管它们周围的间距如何,都有两个标记(int和*)。 -
在声明中,指针制造者星号绑定到下一个变量。这意味着
int* a, b;、int * a, b;和int *a, b;都表示同一个意思:a是指针。 -
@JonathanLeffler 我知道,我的意思是更容易“看到”扩展宏与第一个声明相同。