C头文件错误:预期标识符或'('''''''之前的标记

时间:2011-04-25 00:45:53

标签: c pointers header

我是一个完整的新手。我正在尝试在头文件中定义一些函数,然后在单独的文件中实现它们。但是当我尝试运行gcc runtime.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

错误是什么?我尝试浏览头文件,但他们开始添加“extern”和“intern”以及疯狂的ifdef等内容。谢谢你的帮助,凯文

4 个答案:

答案 0 :(得分:3)

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

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?以获取一个宏,该宏将返回数组中实际数组的元素数,并且当您尝试在指针上使用它时,会在大多数情况下导致编译器错误(在大多数编译器上)。 / p>

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

答案 1 :(得分:3)

摆脱每个“[]”

由于数组是一个指针,你只需要传递指针,如下所示:

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

编辑:同样传递大小。

答案 2 :(得分:2)

使用:

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

答案 3 :(得分:0)

你的[]位置错误。在“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[]