【问题标题】:Can't define variables after any operation? [duplicate]任何操作后都不能定义变量? [复制]
【发布时间】:2017-09-12 07:36:52
【问题描述】:

我的 C 语言老师声称 所有 变量必须在 任何操作之前定义。我记得它是 C 的一个非常古老的特性(不迟于 1990 年),但我无法用 GCC 7.2.0 重现它。

我的老师声称:

int main(){
    int a; /* Valid */
    a = 1; /* An operation */
    int b; /* Invalid because an operation has already occurred */
    return 0;
}

我尝试编译

gcc test.c -std=c89 -Wall -Wextra -pedantic

但它没有给出错误,甚至没有警告。

我如何验证(或证明错误)该陈述?

【问题讨论】:

  • -pedantic-errors
  • 仅供参考,那些// comments 在严格的 c89 中也是无效的。如果它们也没有被 gcc 标记并启用了迂腐错误,我会感到惊讶。叮当肯定会抓住他们。
  • @AnttiHaapala - coliru 的在线编译器(我的链接)是 GCC 7.2.0。这很可能是 OP 的一个错误。
  • @StoryTeller,这里是godbolt

标签: c gcc compiler-errors obsolete


【解决方案1】:

-pedantic-errors编译,像这样:

gcc test.c -std=c89 -Wall -Wextra -pedantic-errors

你应该会看到这个错误(在未使用的变量警告中):

test.c:4:5: error: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
     int b;
     ^~~

在 GCC 7.20 中。

PS:这些cmets也是无效的,我在编译之前删除了它们。

【讨论】:

  • 尝试使用// cmets也应该有错误,在C89中无效
  • @M.M 我已经将它作为 PM,因为我认为这不是 OP 的意图。我应该通过在编译器错误中包含它来高亮它吗?
  • 如何让 GCC 就双斜杠 // cmets 向我发出警告?
  • 如果您使用我在回答中提供的命令编译问题中的代码,您将看到这些 cmets @iBug 收到错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
  • 2018-08-24
  • 1970-01-01
相关资源
最近更新 更多