【问题标题】:What is the meaning of "typedef char CHAR[10];"?“typedef char CHAR[10];”是什么意思?
【发布时间】:2015-07-20 20:36:24
【问题描述】:

遇到一段代码,它定义并使用了 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,则会引发编译错误。我不知道为什么。

【问题讨论】:

  • 什么新的CHAR类型?请在问题中输入代码,而不仅仅是标题。
  • “为什么要定义和使用这样的 typedef”:我会问同样的问题。但我怀疑有人担心如果他们没有将数组的大小包含在typedef 中,他们会忘记它的大小。事实上,sizeof(CHAR) 返回 10。

标签: c++ typedef


【解决方案1】:

这是 C 声明符语法中一个令人困惑的部分,并且不会按照您的想法执行。

抛开逻辑,关注the spiral rule

你认为它做了什么

使CHAR[10] 意味着char

它实际上做了什么

使CHAR 意味着char[10]

这就是为什么在这里“单独”使用CHAR 是完全有效的,即使非常愚蠢。我的意思是,说真的,首先键入一个固定大小的数组是相当愚蠢的,但是将其命名为 CHAR 就很麻烦了。

【讨论】:

  • 为固定数组创建 typedef 并不愚蠢。有很多正当的理由这样做。例如,我使用了几个第三方 API 来执行此操作,例如用于固定长度的 ID 值。它使代码更简洁、更安全,能够声明变量/参数,如ConnectionID connid;DeviceID devid;,而不是char connid[...];char devid[...]。不过,我认为使用像 CHAR 这样基本的东西作为 typedef 名称是愚蠢的。
  • @Remy 是的,这很愚蠢。 ConnectionIDDeviceID 都不像数组类型。
  • 它们是基于字符串的标识符,具有最大字符长度。就像我说的,当用户可以使用单个不同的标识符类型而不是原始 char 数组并且必须记住使用正确的长度来声明变量/参数时,它会使代码更安全、更清晰。如果您不喜欢这种编程安全性,则不必使用它。但是不要仅仅因为你不喜欢/不理解它就说它是愚蠢的,它有一个有效的目的。
  • @RemyLebeau:这是以愚蠢为代价的安全。如果你想要一个静态数组宽度那很好,但要清楚。您在这里所做的是迫使人们记住使用正确的长度,因为从“CHAR”中不清楚您必须使用多少个数组索引。 至少 称它为CHAR12 或类似的名称。不要因为我不 100% 同意你的观点就说我“不明白”:那太荒谬了。
【解决方案2】:
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 尚未初始化。

【讨论】:

  • 非常感谢!现在,如果我将 fun 声明更改为接受 std::string& 而不是 std::string,则会引发编译错误。我不知道为什么。
  • 这是因为可以从char* 构造一个临时的std::string。您不能将std::string& 用于此类对象。您可以使用std::stringstd::string const&
猜你喜欢
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-01
相关资源
最近更新 更多