如何解决静态声明遵循GCC C代码中的非静态声明?

Als*_*nde 37 c gcc

我正在尝试使用不同版本的cc在两台不同的机器上编译相同的C文件.

gcc版本3.2.3说 warning: 'foo' was declared implicitly 'extern' and later 'static'

gcc版本4.1.2说 error: static declaration of 'foo' follows non-static declaration

两者都有相同的CFLAGS.我想让gcc 4.1.2表现得像gcc 3.2.3,也就是说,找到一个可以将这个错误变成一个警告的选项.

hlo*_*dal 29

从错误消息抱怨,听起来你应该尝试修复源代码.编译器抱怨声明的差异,例如类似

void foo(int i);
...
void foo(double d) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

这不是有效的C代码,因此编译器抱怨.

也许你的问题是当第一次使用该函数时没有可用的原型,并且编译器隐式地创建了一个不是静态的.如果是这样,解决方案是在首次使用之前在某处添加原型.


rag*_*got 13

static函数被声明之前被调用的情况下,我遇到了这个问题。将函数声明移动到调用上方的任何位置解决了我的问题。


bjg*_*bjg 6

虽然gcc 3.2.3对这个问题更加宽容,但gcc 4.1.2强调了以后链接程序时可能存在的严重问题.而不是试图压制错误,你应该使前向声明匹配函数声明.

如果您希望函数全局可用(根据前向声明),则不要随后将其声明为静态.同样,如果它缩进为本地范围,则使前向声明静态匹配.


el.*_*ado 5

试试-Wno-traditional

但更好的是,为您的静态函数添加声明:

static void foo (void);

// ... somewhere in code
    foo ();

static void foo ()
{
    // do sth
}
Run Code Online (Sandbox Code Playgroud)