C++ “是什么意思?”;typedef char[10]&引用;?

C++ “是什么意思?”;typedef char[10]&引用;?,c++,typedef,C++,Typedef,遇到一段定义并使用typedef的代码,如下所示: typedef char CHAR[10]; void fun(std::string s) {} int main() { CHAR c; fun(c); } 奇怪的是,这是有效的。我的问题是为什么要定义和使用这样的typedef,以及它是如何工作的。在我看来,CHAR本身不应该起作用,它应该始终是CHAR[10] 此外,如果我将fun声明更改为接受std::string&而不是std::string,则会抛出编译错误。我

遇到一段定义并使用typedef的代码,如下所示:

typedef char CHAR[10];
void fun(std::string s) {}
int main()
{
    CHAR c;
    fun(c);
 }

奇怪的是,这是有效的。我的问题是为什么要定义和使用这样的typedef,以及它是如何工作的。在我看来,CHAR本身不应该起作用,它应该始终是CHAR[10]


此外,如果我将fun声明更改为接受std::string&而不是std::string,则会抛出编译错误。我不知道为什么。

这是C声明程序语法中一个令人困惑的部分,并没有达到您认为的效果

抛开逻辑,遵循逻辑

你认为它有什么作用 使
CHAR[10]
平均
CHAR

它实际上是做什么的 使
CHAR
平均
CHAR[10]


这就是为什么在这里使用
CHAR
“单独”是完全有效的,尽管这非常愚蠢。我的意思是,说真的,首先对固定大小的数组进行类型定义是相当愚蠢的,但是将其命名为
CHAR
需要花费大量时间。

这是C声明程序语法中令人困惑的一部分,并不像您认为的那样

typedef char CHAR[10];
void fun(std::string s) {}
int main()
{
    CHAR c;
    fun(c);
}
抛开逻辑,遵循逻辑

你认为它有什么作用 使
CHAR[10]
平均
CHAR

它实际上是做什么的 使
CHAR
平均
CHAR[10]

这就是为什么在这里使用
CHAR
“单独”是完全有效的,尽管这非常愚蠢。我的意思是,说真的,首先对固定大小的数组进行类型定义是相当愚蠢的,但是将其命名为
CHAR
需要一些技巧

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
尚未初始化

相当于

void fun(std::string s) {}
int main()
{
    char c[10];
    fun(c);
}

从语法上讲,这是正确的代码,因为
std::string
可以从
char*
构造。但是,该代码是未定义行为的原因,因为
c
尚未初始化。

有什么新的
CHAR
类型?请把代码放在问题中,而不仅仅是标题。“为什么定义和使用这样的typedef?”我会问同样的问题。但是我怀疑有人担心如果不将数组包含在
typedef
中,他们会忘记数组的大小。实际上,
sizeof(CHAR)
返回10。有什么新的
CHAR
类型?请把代码放在问题中,而不仅仅是标题。“为什么定义和使用这样的typedef?”我会问同样的问题。但是我怀疑有人担心如果不将数组包含在
typedef
中,他们会忘记数组的大小。实际上,
sizeof(CHAR)
返回10。非常感谢!现在,如果我将fun声明更改为接受std::string&而不是std::string,则会抛出编译错误。我不知道为什么。那是因为可以从
char*
构造一个临时
std::string
。不能对此类对象使用
std::string&
。您可以使用
std::string
std::string const&
。非常感谢!现在,如果我将fun声明更改为接受std::string&而不是std::string,则会抛出编译错误。我不知道为什么。那是因为可以从
char*
构造一个临时
std::string
。不能对此类对象使用
std::string&
。您可以使用
std::string
std::string const&
。为固定数组创建typedef并不愚蠢。这样做有很多正当的理由。我使用了几个第三方API来实现这一点,例如用于固定长度的ID值。它可以声明变量/参数,如
ConnectionID connid,从而使代码更干净、更安全或<代码>设备ID设备ID
,而不是
charconnid[…]
字符设备[…]
。不过,我认为使用像
CHAR
这样的基本名称作为typedef名称是愚蠢的。@Remy是的,它相当愚蠢。
ConnectionID
DeviceID
都不像数组类型。它们是基于字符串的标识符,具有最大字符长度。正如我所说的,当用户可以使用单个不同的标识符类型来声明变量/参数,而不是使用原始字符数组,并且必须记住使用正确的长度时,这使得代码更安全、更清晰。如果您不喜欢这种编程安全性,您就不必使用它。但不要因为你不喜欢/不理解它就说它是愚蠢的,它有一个合理的目的。@RemyLebeau:这是以愚蠢为代价的安全。如果你想要一个静态的数组宽度,这很好,但要清楚。您在这里所做的是强迫人们记住使用正确的长度,因为“
CHAR
”中不清楚您必须使用多少数组索引。至少可以叫它CHAR12或类似的名字。不要因为我不完全同意你的观点就说我“不明白”:那太荒谬了。为固定数组创建typedef并不愚蠢。这样做有很多正当的理由。我使用了几个第三方API来实现这一点,例如用于固定长度的ID值。它可以声明变量/参数,如
ConnectionID connid,从而使代码更干净、更安全或<代码>设备ID设备ID
,而不是
charconnid[…]
字符设备[…]
。不过,我认为使用像
CHAR
这样的基本名称作为typedef名称是愚蠢的。@Remy是的,它相当愚蠢。
ConnectionID
DeviceID
都不像数组类型。它们是基于字符串的标识符,具有最大字符长度。正如我所说的,当用户可以使用单个不同的标识符类型来声明变量/参数,而不是使用原始字符数组,并且必须记住使用正确的长度时,这使得代码更安全、更清晰。如果您不喜欢这种编程安全性,您就不必使用它。但是,不要仅仅因为一件事就说它是愚蠢的