C++ “是什么意思?”;typedef char[10]&引用;?
遇到一段定义并使用typedef的代码,如下所示: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 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
都不像数组类型。它们是基于字符串的标识符,具有最大字符长度。正如我所说的,当用户可以使用单个不同的标识符类型来声明变量/参数,而不是使用原始字符数组,并且必须记住使用正确的长度时,这使得代码更安全、更清晰。如果您不喜欢这种编程安全性,您就不必使用它。但是,不要仅仅因为一件事就说它是愚蠢的