遇到了一段代码,它定义并使用了类似下面的typedef:
typedef char CHAR[10];
void fun(std::string s) {}
int main()
{
CHAR c;
fun(c);
}
奇怪的是这很有效。我的问题是为什么定义和使用这样的typedef以及它是如何工作的。在我看来,CHAR本身不起作用,它应该始终是CHAR [10]。
此外,如果我改变乐趣声明接受std :: string&而不是std :: string,它会抛出编译错误。我不知道为什么。
答案 0 :(得分:7)
这是C声明符语法的一个令人困惑的部分,并没有做你认为它做的事情。
抛弃逻辑并按照the spiral rule。
使CHAR[10]
表示char
。
使CHAR
表示char[10]
。
这就是为什么单独使用CHAR
""如果非常愚蠢,这里完全有效。我的意思是,严肃地说,首先对固定大小的数组进行类型设置非常愚蠢,但命名为CHAR
需要饼干。
答案 1 :(得分:4)
typedef char CHAR[10];
void fun(std::string s) {}
int main()
{
CHAR c;
fun(c);
}
相当于
void fun(std::string s) {}
int main()
{
char c[10];
fun(c);
}
从语法上讲,这是正确的代码,因为std::string
可以从char*
构造。但是,由于c
尚未初始化,因此该代码导致未定义的行为。