我是一个完整的新手。我正在尝试在头文件中定义一些函数,然后在单独的文件中实现它们。但是当我尝试运行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等内容。谢谢你的帮助,凯文
答案 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[]