You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言调用自定义函数编译提示未在当前作用域声明问题咨询

报错原因

C语言采用顺序编译逻辑,编译器解析代码是从上到下逐行执行的。你的代码中在main函数里调用Sayhi()时,编译器还没有读取到后面Sayhi函数的定义信息,既不知道这个函数的返回值类型,也不知道它的参数规则,无法完成调用逻辑的合法性校验,就会抛出*"Sayhi" was not declared in this scope*的编译错误。
部分老旧C编译器会对未提前声明的函数默认生成「返回值为int、参数未知」的隐式声明,但你定义的Sayhi返回值是void,类型和隐式声明不匹配,就算跳过前置报错,后续链接阶段也会出问题,新版GCC、Clang等编译器都会直接拦截这类不规范写法,阻止编译通过。

修复方法

两种常规修复方式选一种即可:

  • 方法1:调整函数定义顺序,把Sayhi的完整实现挪到main函数之前,让编译器在遇到调用语句前就拿到函数的完整信息,修正后代码如下:
#include <stdio.h>
#include <stdlib.h>

void Sayhi()
{ 
   printf("hi");
}

int main()
{
   Sayhi();
   return 0;
}
  • 方法2:在调用函数前提前写函数原型声明,不需要挪动函数实现的位置。函数原型的作用是提前给编译器同步函数的返回值、名称、参数规则,函数的具体实现可以放在文件后面甚至其他编译单元里,修正后代码如下:
#include <stdio.h>
#include <stdlib.h>

// 前置函数声明
void Sayhi();

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

void Sayhi()
{ 
   printf("hi");
}

额外注意:C语言对标识符大小写敏感,调用函数时的名称必须和声明、定义的名称大小写完全一致,不要出现调用写Sayhi、定义写sayhi这类拼写错误,否则同样会触发未声明的报错。

内容的提问来源于stack exchange,提问作者Joel_Alvares

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 06:03:12