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
你应该只传递指针(因为如果你将数组传递给一个函数,真正传递的是一个指针)。此外,您不能返回数组 - 再次,刚刚返回一个指针:
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?
OP不会将数组传递给他的函数。他似乎试图将指针传递给数组,这可能不是他想要做的,即使它是,语法也是错误的。但是为了解决问题+1。 – 2011-04-25 00:52:25
我只想补充说,你遇到的问题是你没有正确地声明数组。 'int []'不是如何在C中声明数组。 – mdec 2011-04-25 00:52:31
谢谢!关于大小 - 为什么不能在运行时函数中调用sizeof(x)? – 2011-04-25 00:52:54
用途:
int* addInts(int* x, int* y, int size);
摆脱每个 “[]”
为一个数组是一个指针,你只需要通过指针,就像这样:
int* _addInts(int* x, int* y);
编辑:亦通的大小。
数组不是指针。在我知道的任何系统上,数组衰减指针,但是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[]
@Pavan:我想用C写的,但不会有一个很好的我还有几天的想法。 – 2011-04-25 00:53:45