C语言中的函数具有内部链接但未定义。

16

我有这个文件夹结构:

structure

我写了一个简单的函数来测试文件夹结构,以查看是否所有头文件都存在,但是当我使用make命令编译时,我会遇到以下错误:

warning: function 'stampa' has internal linkage but is not defined

lagrange.h文件中, 我有以下内容:

#ifndef LAGRANGE_H

static void stampa(int i);

#endif /* LAGRANGE_H */

lagrange.c 文件中,我有以下代码:

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

#include <stdio.h>

void stampa(int i){
    printf("%d", i);
}

最终,在 main.c 中,我只是调用了函数 stampa 并传递了一个数字。


2
附注:您忘记在lagrange.h中放置#define LAGRANGE_H - Weather Vane
5
lagrange.h中的static关键字删除。 - user3386109
1
在相应的.c文件中包含头文件是一个好习惯。因此,在lagrange.c中应该有一个#include "lagrange.h" - user3386109
3
在定义函数时,static 表示“仅在此源文件中使用”。如果将其放在头文件中,则要么没有意义,要么会在包含它的每个文件中创建一个新的函数副本。这不是你想要的结果。 - Zan Lynx
1个回答

37

错误的解释:

编译错误是由于以下原因导致的:

  1. 您在lagrange.h中声明了一个带有static关键字的函数(即带有内部链接),
  2. 并且您将此文件lagrange.h包含在与lagrange.c不同的main.c文件中,而后者未定义该函数。

因此,当编译器编译main.c文件时,它会遇到没有任何相关定义的static声明,并逻辑上引发错误。错误消息是明确的。

解决方案:

在您的情况下,解决方案是删除static关键字,因为static表示该函数只能在其定义所在的.c文件中调用,而这不是您的情况。
此外,一个好习惯可能是在同一.c文件中声明任何static函数,而不是在.h文件中声明。


5
别忘了将东西放在匿名命名空间中也会使其成为文件静态的。例如,namespace { ... } 只对该代码翻译单元可见。 - Jesse Chisholm
@JesseChisholm 这只涉及到C++,但是OP在谈论C。 - Nimrod Dayan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接