原本正常的代码出现 C 编译错误

问题描述 投票:0回答:2

我的系统上有一个 minGW GCC 编译器。我正在用 C 编写代码。由于某种原因,一些原本正常的代码无法正确编译。

#include <stdio.h>
#include <math.h>

int main() {
    
    sayHi();
    return 0;
}

void sayHi(){
    printf("Hello bro");
}

cmd中的输出为:

6:2: warning: implicit declaration of function 'sayHi' [-Wimplicit-function-declaration]

然后它说
10:6: warning: conflicting types for 'sayHi' void sayHi(){

此外,
:6:2: note: previous implicit declaration of 'sayHi' was here sayHi();


我在在线编译器上尝试了相同的操作,但这仍然不起作用并给出相同的错误。然而,在 freecodecamp 教程中,编写了相同的代码,但它执行得很好。这怎么可能?

c
2个回答
0
投票

编译器在使用 sayHi() 函数之前需要了解它。有两种选择:

  1. 将 sayHi() 函数定义移至主函数上方。

  2. 在主函数之前声明 sayHi() 函数,例如:

    无效 sayHi();


0
投票

当编译器看到

sayHi();
时,它还没有看到
void sayHi()
,因此它认为
sayHi()
隐式声明为
int sayHi()

然后它看到

void sayHi()
,但由于
sayHi()
现在(隐式)声明为
int sayHi()
,返回类型现在发生冲突。

根据经验,您应该将包含“隐式”一词的警告视为错误。

你想要这个:

void sayHi();  // declare explicitely before using it

int main() {
    
    sayHi();
    return 0;
}

void sayHi(){
    printf("Hello bro");
}

或者这个:

void sayHi() {            // put the whole function before using it
    printf("Hello bro");  // which declares it as void
}

int main() {    
    sayHi();
    return 0;
}

更好:

void sayHi()
应该是
void sayHi(void)
,它声明
sayHi
函数根本不带参数。

© www.soinside.com 2019 - 2024. All rights reserved.