Ошибка файла заголовка C: ожидаемый идентификатор или ‘(’ перед ‘[’] - PullRequest
0 голосов
/ 25 апреля 2011

Я полный c новичком.Я пытаюсь определить несколько функций в заголовочном файле, а затем реализовать их в отдельном файле.Но когда я пытаюсь запустить 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 ]

3 голосов
/ 25 апреля 2011

Избавьтесь от каждого "[]"

Поскольку массив является указателем, вам нужно только передать указатели, например, так:

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

РЕДАКТИРОВАТЬ: Также передать размер.

3 голосов
/ 25 апреля 2011

Вы должны просто передавать указатели (поскольку, если вы передаете массивы в функцию, что; действительно, в любом случае передается указатель). Кроме того, вы не можете вернуть массив - опять же, просто верните указатель:

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));
}

Это одна из причин, почему я предпочел бы, чтобы параметры объявлялись как указатели, а не как массивы - потому что они действительно будут указателями.

См. Существует ли в C стандартная функция, которая возвращает длину массива? для макроса, который возвращает количество элементов в массиве для фактических массивов и вызывает ошибку компилятора (включено большинство компиляторов) большую часть времени, когда вы пытаетесь использовать его в указателях.

Если ваш компилятор GCC, вы можете использовать хитрость Linux: Эквиваленты _countof MSVC в других компиляторах?

2 голосов
/ 25 апреля 2011

Использование:

int* addInts(int* x, int* y, int size);
0 голосов
/ 25 апреля 2011

У вас есть [] в неправильных местах.Синтаксис для объявления массивов в «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[]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...