C 语言中函数的隐式声明

Ammar Ali 2023年10月12日
C 语言中函数的隐式声明

本教程讨论通过在 C 语言中声明 main 函数上方的函数来消除隐式函数声明的警告。

C 语言中函数的隐式声明

有时,编译器会在 C 语言中显示函数隐式声明的警告,这意味着该函数没有在 main() 函数之上声明,或者它的头文件不包括在内。

例如,printf() 函数属于 stdio.h 头文件,如果我们在 C 源文件中使用它之前没有包含它,编译器将显示函数声明是隐式的警告.

在这种情况下,我们必须包含头文件,其中包含函数声明或在 main() 函数之上声明函数。例如,让我们使用 printf() 函数而不包括其头文件。

请参阅下面的代码。

int main() {
  int a = 10;
  printf("a = %d", a);
  return 0;
}

输出:

main.c: In function 'main':
main.c:5:5: warning: implicit declaration of function 'printf' [-Wimplicit-function-declaration]
    5 |     printf("a = %d",a);
      |     ^~~~~~
main.c:5:5: warning: incompatible implicit declaration of built-in function 'printf'
main.c:1:1: note: include '<stdio.h>' or provide a declaration of 'printf'
  +++ |+#include <stdio.h>
    1 |
a = 10

在上面的输出中,我们可以看到编译器给出了一个警告,说 printf() 函数的声明是隐式的,我们必须包含 <stdio.h> 文件,或者我们必须提供一个声明源文件中的 printf() 函数。

我们还可以看到 a 的值被打印出来,这意味着 printf() 函数可以完美运行,即使我们没有包含它的头文件。

现在,让我们包含头文件并重复上面的示例。请参阅下面的代码。

#include <stdio.h>

int main() {
  int a = 10;
  printf("a = %d", a);
  return 0;
}

输出:

a = 10

我们可以在上面看到这次没有显示隐式函数声明的警告,因为我们已经包含了 printf() 函数的头文件。

如果我们在源文件中创建了一个函数但没有在 main() 函数上方声明它,也会显示隐式函数声明警告。

当我们尝试调用函数时,编译器会警告函数声明是隐式的。例如,让我们创建一个函数并从 main() 函数调用它,而不在 main() 函数之上声明它。

#include <stdio.h>

int main() {
  int a = fun(2, 3);
  printf("a = %d", a);
  return 0;
}

int fun(int x, int p) {
  int a = x + p;
  return a;
}

输出:

main.c: In function 'main':
main.c:4:13: warning: implicit declaration of function 'fun' [-Wimplicit-function-declaration]
    4 |     int a = fun(2, 3);
      |             ^~~
a = 5

在上面的输出中,我们可以看到我们创建的函数显示了警告。我们必须在 main() 函数之上声明函数来解决这个问题。

例如,让我们在 main() 函数上方声明该函数并重复上面的示例。请参阅下面的代码。

#include <stdio.h>

int fun(int x, int p);
int main() {
  int a = fun(2, 3);
  printf("a = %d", a);
  return 0;
}

int fun(int x, int p) {
  int a = x + p;
  return a;
}

输出:

a = 5

我们可以看到警告现在消失了。我们也可以在头文件中声明函数,然后将头文件包含在源文件中,这在函数很多的情况下很有用,因为它会简化代码。

作者: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

相关文章 - C Function