如果变量声明不在函数顶部,则禁用它们

时间:2018-08-09 14:27:05

标签: c function gcc compilation warnings

我想知道是否有人在没有在函数顶部声明变量的情况下强制gcc使当前编译失败。

void foo() {

  int bar; //Enabled

  /* some code stuff */

  int bar2; //Compile Error
}

我已经看到我需要使用-pedantic && -ansi进行编译。 我的项目已经是这种情况,但似乎不起作用。

顺便说一句,我正在C89中进行编译,确实需要保持该C版本。 (-ansi

在我所看到的所有文档中,没有gcc标志允许执行此操作。 有什么我想念的吗?

2 个答案:

答案 0 :(得分:4)

有一个警告语句后声明或声明的变量的选项:

  • -Wdeclaration-after-statement-警告,除非您还设置了-Werror(并且始终使用-Werror是个好主意;您将不会忘记修正警告!)
  • -Werror=declaration-after-statement-即使未设置-Werror
  • ,也会出错

这将强制将变量定义在任何语句块的顶部(如C90所要求),而不是允许在需要时声明变量(如C99及更高版本所允许)。这不允许:

int function(int x)
{
    int y = x + 2;
    printf("x = %d, y = %d\n", x, y);
    int z = y % x;     // Disallowed by -Wdeclaration-after-statement
    printf("z = %d\n", z);
    return x + y + z;
}

我不知道有一个选项可以阻止您在函数的内部块的{之后声明变量。

答案 1 :(得分:0)

-pedantic仅针对需要标准发布的情况发布诊断。这些只是警告。假设与 -pedantic-errors -ansi结合使用时,-std=c90将具有您想要的行为;)

示例:

#include <stdio.h>
int main(void) {
    printf("Hello Stack Overflow\n");
    int fail;
}

然后:

% gcc test.c -ansi -pedantic
test.c: In function ‘main’:
test.c:4:3: warning: ISO C90 forbids mixed declarations and code 
       [-Wdeclaration-after-statement]
   int fail;
   ^~~
% ./a.out
Hello Stack Overflow

但带有-pedantic-errors

% gcc test.c -ansi -pedantic-errors
test.c: In function ‘main’:
test.c:4:3: error: ISO C90 forbids mixed declarations and code         
       [-Wdeclaration-after-statement]
   int fail;
   ^~~
% ./a.out
bash: ./a.out: No such file or directory

版本是

% gcc --version
gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

请注意,即使ISO C90也不要求声明必须在函数的顶部-任何 compound语句的开头都将这样做。