C头文件错误:期望的标识符或'('之前'['令牌

问题描述:

我是一个完整的c newb。我试图定义一个头文件中的几个函数,然后在一个单独的文件中实现它们。当我尝试运行gcc runtime.c我收到以下错误:C头文件错误:期望的标识符或'('之前'['令牌

In file included from runtime.c:1: 
runtime.h:7: error: expected identifier or ‘(’ before ‘[’ token 

这里的runtime.h的内容:

#ifndef HEADER 
#define HEADER 

/*given two arrays of ints, add them 

*/ 
int[] * _addInts(int[] *x, int[] *y); 

#endif 

有什么错误我试图浏览头文件,但他们开始增加之类的东西“外部“和”实习生“以及疯狂的ifdef。感谢您的帮助,Kevin

+0

@Pavan:我想用C写的,但不会有一个很好的我还有几天的想法。 – 2011-04-25 00:53:45

你应该只传递指针(因为如果你将数组传递给一个函数,真正传递的是一个指针)。此外,您不能返回数组 - 再次,刚刚返回一个指针:

int* _addInts(int *x, int *y); // equivalent to: int* _addInts(int x[], int y[]); 

您还必须为元素的数量安排以某种方式被传递。像下面为你可能的工作:

int* _addInts(int *x, int *y, size_t count); 

而且 - 做陷入试图对阵列参数使用sizeof下的圈套,因为他们是用C真的指针:

int* _addInts(int x[], int y[]) 
{ 
    // the following will always print the size of a pointer (probably 
    //  4 or 8): 
    printf("sizeof x: %u, sizeof y: %u\n", sizeof(x), sizeof(y)); 
} 

这就是为什么我更喜欢将参数声明为指针而不是数组的原因之一 - 因为它们确实是指针。

请参阅Is there a standard function in C that would return the length of an array?宏将返回数组中实际数组元素的数量,并且当您尝试在指针上使用它时,很多时候会导致编译器错误(在大多数编译器上)。

如果你的编译器GCC,你可以使用Linux的绝招:Equivalents to MSVC's _countof in other compilers?

+0

OP不会将数组传递给他的函数。他似乎试图将指针传递给数组,这可能不是他想要做的,即使它是,语法也是错误的。但是为了解决问题+1。 – 2011-04-25 00:52:25

+1

我只想补充说,你遇到的问题是你没有正确地声明数组。 'int []'不是如何在C中声明数组。 – mdec 2011-04-25 00:52:31

+0

谢谢!关于大小 - 为什么不能在运行时函数中调用sizeof(x)? – 2011-04-25 00:52:54

用途:

int* addInts(int* x, int* y, int size); 

摆脱每个 “[]”

为一个数组是一个指针,你只需要通过指针,就像这样:

int* _addInts(int* x, int* y); 

编辑:亦通的大小。

+0

数组不是指针。在我知道的任何系统上,数组衰减指针,但是sizeof(char [7])!= sizeof(char *)'。 – 2011-04-25 00:55:19

你在错误的位置有[]。在“C”中声明数组的语法使得[]在要成为数组的项之后,而不是在类型声明和项之间(如Java和C#使用)。我不确定你想要声明什么,但这里有一些选项:

如果你想声明你将使用一个名为“_addInts()”的函数返回一个指向int的指针,作为其参数指针为整数的两个独立的阵列名为x和y -

int * _addInts(int *x[], int *y[]); 

如果你想声明的是返回整数数组的指针的函数:

int * _addInts(int *x[], int *y[])[]; 

如果_addInts是一个函数它接受两个int数组(而不是int *数组):

int * _addInts(int x[], int y[]); 

请注意以下(几乎)等效,并且可以在您尝试的声明中互换使用。

int *x 

int x[] 

的是:

int **x 

int *x[]