以下是:为什么会出来?
#include <stdio.h>
void iniStudentLink(struct STUDENT_LINK * L);
int main(){
return 0;
}
void iniStudentLink(struct STUDENT_LINK * L){
printf("hello world!\n");
}
显示错误:inniStudentLink的类型冲突。
答案 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; };
。