#include<stdio.h>
extern struct members;
int main(){
printf("\n %d \n",members.a1);
printf("%d",add(2,2));
printf("%d",sub(2,2));
}
typedef struct members_t{
int a1;
int b1;
}members;
int add(int a,int b){
return (a+b);
}
int sub(int a,int b){
return (a-b);
}
我需要单独生成.o,并且需要在创建可解决的依赖项的同时组合.o&#39;
我分别编译了e1.c并得到了以下错误,
[root@angus]# gcc -c e1.c -o e1.o
e1.c:2: warning: useless storage class specifier in empty declaration
e1.c: In function ‘main’:
e1.c:4: error: ‘members’ undeclared (first use in this function)
e1.c:4: error: (Each undeclared identifier is reported only once
e1.c:4: error: for each function it appears in.)
如何分别生成.o&而无错误。
我使用extern通知编译器这是在某处定义的,但仍然会出现上述错误。
答案 0 :(得分:1)
编译e1.c时,编译器必须具有struct members_t
的完整声明以及add()和sub()函数的声明(原型),所以你应该将它放在头文件。
第1步。 将声明移动到头文件。
创建新的头文件,如下所示:
#ifndef E_HEADER_H
#define E_HEADER_H
typedef struct members_t{
int a1;
int b1;
}members;
int add(int a,int b);
int sub(int a,int b);
#endif
并命名此e.h
第2步。
添加
#include "e.h"
到e1.c和e2.c.
第3步。
从e2.c中删除struct members_t的声明
第4步。
从e1.c中删除extern struct members;
的前向声明
第5步。
修复代码。您需要实际创建成员struct的实例,并初始化它 成员
#include <stdio.h>
#include "e.h"
int main(int argc, char *argv[]){
members m;
m.a1 = 1;
m.a2 = 2;
printf("\n %d \n",m.a1);
printf("%d",add(2,2));
printf("%d",sub(2,2));
}
然后你可以按照你想要的那样编译文件。
答案 1 :(得分:1)
struct members
是一种类型。 members
不是对象,members.a1
是语法错误。其他人对将类型定义放在头文件中的说法是正确的,但另外您需要定义该类型的对象。