【问题标题】:Is (void)strcpy(somevariable1, somevariable2) correct? [closed](void)strcpy(somevariable1, somevariable2) 是否正确? [关闭]
【发布时间】:2017-06-23 12:56:13
【问题描述】:

我正在学习编程。我想知道上述用法是否正确。这是正确的吗?

(void)strcpy(somevariable1, somevariable2);

这与类型转换有关吗?

【问题讨论】:

  • 可能是为了抑制未使用的返回值警告。
  • 您想知道 what 的用法是否正确?剧组?参数?分号?
  • 您无法确定那一行是否正确。这取决于 somevariable1 和 somevariable2 是什么,以及它们的内容是什么。
  • OP 正在询问这个令人惊讶的演员阵容的目的,一个明确的解释也会对其他人有所帮助。恕我直言,编译器抱怨 strcpy() 的返回值没有被使用是相当愚蠢的,即使是最迂腐的警告设置。

标签: c function syntax


【解决方案1】:

strcpy 具有以下语法:

char * strcpy ( char * destination, const char * source );

它返回destination,它是pointer to char。当您将返回值显式转换为 (void) 时,您实际上是在做

(void)(char*)

您将返回值强制为空,或者您只是将其丢弃。这有助于抑制一些编译器警告,尤其是在您不使用返回值时。

【讨论】:

    【解决方案2】:

    是的,这是正确的,但你并没有真正在这里投射任何东西。您只是明确地告诉您的编译器您想要删除 strcpy() 的返回值,它不应该警告您不要检查返回值(因为这样做通常是个好主意)。

    【讨论】:

      【解决方案3】:

      一种类型转换,但不是必需的。 void 是一个不完整的类型,用于建模 nothing(或者,作为指向 void 的指针,通用数据)。

      将函数的返回值强制转换为 void 的原因只是文档:它明确表明您不会使用返回值。如果省略强制转换,编译器的某些激进警告设置可能会发出有关未使用的返回值的警告。

      【讨论】:

        【解决方案4】:

        这个表达式是有效的。

        使用(void) 强制转换表达式是一种明确声明表达式语句的值(例如函数调用的结果)将被丢弃的方式。

        C standard 的第 6.8.3 节中有一个示例:

        4 示例 1 如果一个函数调用被评估为一个表达式语句只是为了它的副作用,它的值的丢弃可能 通过将表达式转换为 void 表达式来显式化 演员表:

        int p(int);
        /* ... */
        (void)p(0);
        

        【讨论】:

          猜你喜欢
          • 2016-08-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-11
          • 1970-01-01
          • 2021-07-02
          • 2012-01-29
          • 1970-01-01
          相关资源
          最近更新 更多