收到错误“函数的类型冲突”,为什么?

时间:2018-12-30 03:21:22

标签: c

以下是:为什么会出来?

#include <stdio.h>

void iniStudentLink(struct STUDENT_LINK * L);

int main(){
    return 0;
}

void iniStudentLink(struct STUDENT_LINK * L){
    printf("hello world!\n");
} 

显示错误:inniStudentLink的类型冲突。

1 个答案:

答案 0 :(得分:1)

这些是gcc在编译代码时出现的问题(将其包含在问题中以使其变得更完整是很方便的,这只是对将来的建议):

testprog.c:3:28: warning: 'struct STUDENT_LINK' declared inside
           parameter list will not be visible outside of
           this definition or declaration
           void iniStudentLink(struct STUDENT_LINK * L);
                                      ^~~~~~~~~~~~
testprog.c:9:28: warning: 'struct STUDENT_LINK' declared inside
           parameter list will not be visible outside of
           this definition or declaration
           void iniStudentLink(struct STUDENT_LINK * L){
                                      ^~~~~~~~~~~~
testprog.c:9:6: error: conflicting types for ‘iniStudentLink’
          void iniStudentLink(struct STUDENT_LINK * L){
               ^~~~~~~~~~~~~~
testprog.c:3:6: note: previous declaration of ‘iniStudentLink’ was here
          void iniStudentLink(struct STUDENT_LINK * L);
               ^~~~~~~~~~~~~~

换句话说,您正在声明该结构的两个独立实例,而实际上没有定义(a)。之所以认为它们独立是因为它们的范围仅限于声明它们的实际功能。

您可以通过实际上定义它来解决此问题,以便声明都引用该定义,例如with(在任何其他用途之前):

struct STUDENT_LINK { int some_data; };

换句话说,这样编译就可以了:

#include <stdio.h>
struct STUDENT_LINK { int some_data; };
void iniStudentLink (struct STUDENT_LINK *L);
int main(void) { return 0; }
void iniStudentLink (struct STUDENT_LINK *L){ puts("hi!"); }

(尽管它可能会警告您实际上并未在函数中使用 L的事实。)


(a)在C语言中声明和定义之间的基本区别是:

声明是指在不创建某物的情况下声明某物的存在,例如(在您的情况下)声明您想要将指向它的指针传递给函数。

定义它的字面意思是,定义它是什么,而不只是它是什么。

示例声明为extern int i;struct xyzzy;,等效定义为int i;struct xyzzy { int plugh; };