Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C “为什么要终止?”;性格是一种警告?_C_Gcc_Compiler Errors_Compilation_Compiler Warnings - Fatal编程技术网

C “为什么要终止?”;性格是一种警告?

C “为什么要终止?”;性格是一种警告?,c,gcc,compiler-errors,compilation,compiler-warnings,C,Gcc,Compiler Errors,Compilation,Compiler Warnings,例如,当我们编译以下代码时: printf("hello); 我们得到一个警告,然后是一个关于缺少“字符的错误。在我看来,警告告诉我们一个可以编译的代码,但其行为可能与开发人员期望的不同。因此,我的理解遗漏了两件事: 是否有一个完整的代码可以在包含这样一部分代码的同时编译而不出错 如果这样的代码不存在,为什么这个缺少字符的情况不会给我们一个错误(不是警告+错误) 编辑(我正在尽最大努力处理非主题投票建议): 1.期望的行为:只有一条错误诊断消息,不需要对同一事物发出警告 我无法接受第一个答案的

例如,当我们编译以下代码时:

printf("hello);
我们得到一个警告,然后是一个关于缺少
字符的错误。在我看来,警告告诉我们一个可以编译的代码,但其行为可能与开发人员期望的不同。因此,我的理解遗漏了两件事:

  • 是否有一个完整的代码可以在包含这样一部分代码的同时编译而不出错
  • 如果这样的代码不存在,为什么这个缺少字符的情况不会给我们一个错误(不是警告+错误)
  • 编辑(我正在尽最大努力处理非主题投票建议):
    1.期望的行为:只有一条错误诊断消息,不需要对同一事物发出警告

  • 我无法接受第一个答案的其他相关问题:
  • 2.1 printf_s()是否存在相同的问题?我尝试启用-c11选项,但没有成功


    2.2在我看来,发出警告的历史原因似乎不合理,因为为什么在类似情况下没有使用此双重消息(新c版本中禁止使用旧的公认结构).

    当您的编译器检测到程序格式不正确时,可能会发出错误,并说明程序在发生位置格式不正确的直接原因

    这通常是无用的,因为错误可能在许多行之外

    它还会发出警告,这些警告是猜测(通常是经过教育的猜测)是什么导致了您的问题。可能是您忘记了前一行中的
    ,未能关闭
    {
    )。警告不是“此标记是错误点”,而是“这是所有错误发生的地方”

    实际上,C++标准本身并不区分警告和错误;它们都是诊断。它规定一些事情导致诊断,并且不禁止编译器发出附加的诊断。编译器甚至可以免费编译错误的程序。 我希望“字符串中的换行符”会出现错误,然后会出现指向打开引号的警告

    在我看来,警告告诉我们可以编译的代码 但是,谁的行为可能与开发人员的行为不同 因此,我的理解遗漏了两件事:

    <>你的观点与此无关,C标准和C++标准都不区分不同类型的诊断消息。事实上,许多编译器确实区分了一个基于历史的约定,尽管是一个广泛观察的惯例。最终的问题是编译器通过这种区分意味着什么。另一方面,幸运的是,GCC确实采用了与您描述的类似的约定,如文件所述:

    • 错误报告导致无法编译程序的问题。[…]

    • 警告报告代码中可能指示问题的其他异常情况,尽管编译可以(并且确实)继续。[…]

    (GCC 7.2手册,第13.9节;相同或类似文本也出现在手册的早期版本中,至少返回到第4节。)

    请注意,文档对警告的定义与您的略有不同:GCC警告表示编译可以继续,但不能保证编译可以成功完成。如果它最终不能完成,那么我希望GCC根据其文档也会发出错误诊断。这就是实际上,我在这个测试程序中观察到的情况,无论是以C还是C++编译:

    #include <stdio.h>
    
    int main(void) {
        printf("hello);
    }
    
    这种行为在GCC 3.2中已经被弃用,并且早在GCC 4(当前为7.2)中就被删除了

  • 如果这样的代码不存在,为什么这个缺少字符的情况不会给我们一个错误(不是警告+错误)

  • 我们只能猜测,但这似乎是合理的,它源自上述语言扩展的历史存在。同样,您对此做得太多了。GCC针对同一个问题发出了两种诊断——那又怎样?诊断的最终目的是帮助您找出您的cod有什么问题或可能有什么问题e、 在这种情况下,GCC发出的诊断信息可以很好地完成这项工作。

    请告诉我们警告和错误。@Mahdaoui7请回答您的问题,并将所有澄清放在那里。如果内存可用(如果不是这样,我肯定会被告知!)非常旧的C版本允许通过简单地在引号中包含新行来创建多行文字。例如,GCC 3.2允许这样做-编译器不必给出警告或错误,只需一个诊断。消息的类型和质量是由实现定义的。我敢打赌,后面会有更多的错误/警告这一个的结果。请发布一个完整的例子,其他人可以编译。谢谢你的一般性回答。但我不理解的是那个特殊的情况。重新措辞:如果gcc只生成一个错误,它会缺少什么(请注意,在这种特殊情况下,警告和错误的状态是相同的,它们位于同一行,实际错误并不在多行之外)。@Mahdaoui7-“实际错误并不在多行之外。”“:您需要发布您的实际代码。请阅读其含义。在任何情况下,正如其他人所说,诊断是错误还是警告是由实现定义的。非常感谢您的详细答复。您猜我想知道“是否有代码会引发警告而不是错误”这正是我的意思。然而,您提到错误和警告之间的区别,声称“错误…使编译和警告报告其他..条件变得不可能”只是扩大了我的兴趣,因为在本例中,警告没有提及其他条件。因此
        printf("hello);
        Goodbye");