函数定义中的声明说明符中的两个或多个数据类型

时间:2013-10-24 18:29:56

标签: c

我有以下书籍记录程序

#include <stdio.h>
#include <string.h>
#define SIZE 7
struct books{
        char name[100],author[100];
        int year,copies;
    };
struct books book1[SIZE],book2[SIZE],book3[SIZE],*list;
void union(struct books *,struct books *,struct books *,int);  

main()  
{  
 //code here  
}  

void union(struct books *list1,struct books *list2,struct books *list3,int n1,int n2)  
{  
 //code here  
}  

我在函数声明和defination 中收到错误

error: expected ‘{’ before ‘(’ token
error: two or more data types in declaration specifiers

这里有什么问题?

6 个答案:

答案 0 :(得分:2)

union C 中的reserved keyword,因此您无法将该名称用于某个功能。如果我们查看段落 1 中的draft C99 standard部分6.4.1 关键字,请说:

  

关键字:

之一

并将 union 作为列表的一部分,并在段落 2 中说:

  

保留上述令牌(区分大小写)(在翻译阶段7和8中)以供使用   关键字,不得以其他方式使用。[...]

还有一些其他问题,main需要返回int。标准部分5.1.2.2.1 计划启动表示(强调我的):

  

程序启动时调用的函数名为main。实施宣布否   这个功能的原型。 应使用返回类型int [...]

进行定义

你和函数的声明和定义是不同的。该定义还有一个int参数:

void union(struct books *list1,struct books *list2,struct books *list3,
            int n1,int n2)  
                  ^^^^^^^

答案 1 :(得分:2)

union是C中的保留关键字。尝试选择其他函数名称。

答案 2 :(得分:2)

您不应将union用作函数名称。它是C中的reserved keyword

检查Keywords reserved by the C language

已定义保留关键字含义,并且无法将其重新定义为其他任何内容。 在命名除了这些名称之外的函数和变量时,可以为变量,函数等选择合理长度的名称。

修改

void union(struct books *,struct books *,struct books *,int);  //declaration

void union(struct books *list1,struct books *list2,struct books *list3,int n1,int n2)   //definition  
                                                                                ^^
{

} 

你在定义中有一个额外的参数修改声明或定义。

同时使用返回类型main()定义int

答案 3 :(得分:1)

union是C中的保留关键字。您可以尝试为您的函数获取其他名称

main的返回类型也应为int

答案 4 :(得分:1)

你对union的定义是在三个成员之间使用,,并且在每个成员声明中都不包含变量名,并且使用void是不正确的,因为你声明了变量,而不是函数:

void union(struct books *,struct books *,struct books *,int);

如果您使用;代替,并包含成员名称,则会进行编译:

union {struct books *a;struct books *b;struct books *c;int d;} ;   

另一方面,如果您正在对函数进行原型设计,则{C}中保留union,并且不能将其用作函数名称。选择一个不同的名称,然后您可以使用,分隔符,而不必在每个参数中使用变量名称,并且可以返回void:

void unionName(struct books *,struct books *,struct books *,int); //this is a legal function prototype.  

如果你正在使用的函数原型,请确保原型与下面的函数定义匹配,目前它不符合:

//prototype
union (struct books *,struct books *,struct books *,int d) ;   


//definition
void union(struct books *list1,struct books *list2,struct books *list3,int n1,int n2)
{  
  //some code
}  

此外,main()最好写成:

int main(void)
{
//some code...  
return 0;
}

答案 5 :(得分:1)

首先,'union'是保留关键字,因此请更改您的函数名称。 其次,main也是一个函数,从你的程序执行开始,在main之前写入void或int。如果你声明void main那么,不要返回任何值,但如果你选择int main,那么在你的程序结束时返回任何整数值。