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

时间:2010-06-30 10:15:01

标签: 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,也就是说,找一个可以把这个错误变成一个警告的选项。

6 个答案:

答案 0 :(得分:29)

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

void foo(int i);
...
void foo(double d) {
    ...
}

并且这不是有效的C代码,因此编译器会抱怨。

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:4)

尝试-Wno-traditional

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

static void foo (void);

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

static void foo ()
{
    // do sth
}

答案 3 :(得分:2)

在声明static函数之前调用了implementation 'com.android.support:appcompat-v7:27.1.1'函数时,我遇到了这个问题。将函数声明移动到调用之上的任何地方都解决了我的问题。

答案 4 :(得分:1)

您已在某个文件中将某个函数声明为非静态函数,并且您已在另一个文件中实现静态,或者同一文件中的某个文件也会导致此问题。 例如,以下代码将产生此错误。

void inlet_update_my_ratio(object_t *myobject);
//some where the implementation is like this
static void inlet_update_my_ratio(object_t *myobject) {
//code
}

如果从实现中删除静态,则错误将消失如下。

 void inlet_update_my_ratio(object_t *myobject) {
    //code
    }

答案 5 :(得分:-2)

我有一个类似的问题,我正在使用的函数名称与我在程序中包含的一个头文件中声明的内置函数之一匹配。阅读编译器错误消息将告诉您确切的头文件和函数名称。更改函数名称为我解决了这个问题