Как исправить строковый параметр «ошибка: ожидается; или) перед» - PullRequest
0 голосов
/ 20 сентября 2019

Мы пытаемся реализовать оболочку bash в c для нашего проекта.Прямо сейчас я делаю функцию addAlias ​​и ее основанную на нашей функции AddToken (которая заполняет нашу структуру strArray).

Структура strArray имеет ** char (строковый массив) и int для числа токеновв массиве.Точно так же структура aliasArray имеет два ** char и int для числа псевдонимов.Реализация была почти идентична, поэтому я не понимаю, откуда исходит ошибка в функции addAlias.

Я уже пытался искать в стеке и перемещать код, но я понятия не имею, что его вызвало.

это из заголовочного файла:

typedef struct
{
    char** shortcuts;
    char** notshort;
    int numaliases;
} aliasArray;

void addAlias(aliasArray* instr_ptr, char* short, char* long);

это функция из файла c, которая должна заполнять два массива ярлыком и его псевдонимом, заданным параметрами соответственно:

void addAlias(aliasArray* instr_ptr, char* short, char* long)
{
    //extend token array to accomodate an additional token
if (instr_ptr->numaliases == 0)
{
    instr_ptr->shortcuts = (char**) malloc(sizeof(char*));
    instr_ptr->notshort = (char**) malloc(sizeof(char*));
}
else
{
    instr_ptr->shortcuts = (char**) realloc(instr_ptr->shortcuts, (instr_ptr->numaliases+1) * sizeof(char*));
    instr_ptr->notshort = (char**) realloc(instr_ptr->notshort, (instr_ptr->numaliases+1) * sizeof(char*));
}

    //allocate char array for new token in new slot
instr_ptr->shortcuts[instr_ptr->numaliases] = (char *)malloc((strlen(short)+1) * sizeof(char));
instr_ptr->notshort[instr_ptr->numaliases] = (char *)malloc((strlen(long)+1) * sizeof(char));
strcpy(instr_ptr->shortcuts[instr_ptr->numaliases], short);
strcpy(instr_ptr->shortcuts[instr_ptr->numaliases], long);

instr_ptr->numaliases++;

}

и это объявления нашей основной функции: aliasArray aliases;

aliases.shortcuts = NULL;
aliases.notshort = NULL;
aliases.numaliases = 0;

это весь код, который я добавил для этой части, и когда я пытаюсьзакомментируйте это и запустите все с помощью gcc -g, я получаю несколько не связанных предупреждений, но все работает нормально.Когда он не закомментирован и я пытаюсь его запустить, я получаю следующие ошибки:

In file included from commandler.c:1:0:
commandler.h:17:44: error: expected â;â, â,â or â)â before âshortâ
 void addAlias(aliasArray* instr_ptr, char* short, char* long);
                                        ^
commandler.c:295:44: error: expected â;â, â,â or â)â before âshortâ
 void addAlias(aliasArray* instr_ptr, char* short, char* long)

Ответы [ 3 ]

4 голосов
/ 20 сентября 2019

Это char* short и char* long проблемы.short и long являются именами типов в C. Вы должны использовать другое имя параметра.

1 голос
/ 20 сентября 2019

В соответствии со Стандартом C (6.4.1 Ключевые слова)

2 Вышеуказанные токены (с учетом регистра) зарезервированы (в фазах перевода 7 и 8) для использования в качестве ключевых слов, a nd не должен использоваться иначе .

и (6.4.2 Идентификаторы)

4 Когда токены предварительной обработки преобразуются в токены во время фазы 7 перевода, еслиТокен предварительной обработки может быть преобразован в ключевое слово или идентификатор, он преобразуется в ключевое слово .

В прототипе функции вы можете опустить идентификаторы параметров

void addAlias( aliasArray*, char*, char* );

В определении функции вы должны использовать другие идентификаторы для имен параметров, отличных от ключевых слов.

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

void addAlias(aliasArray* instr_ptr, char* shortcut, char* nonshortcut)

Также учтите, что параметры должны иметь квалификаторы const.

void addAlias(aliasArray* instr_ptr, const char* shortcut, const char* nonshortcut)

В противном случае объявление функции приведет в замешательство пользователей функции и не сможет принимать постоянные указатели, хотя функция не изменяет соответствующие строки.

1 голос
/ 20 сентября 2019

short и long являются зарезервированными словами в C (например, int и void).

Их нельзя использовать в качестве имен переменных.

Рекомендуетсяизменить:

void addAlias(aliasArray* instr_ptr, char* shortName, char* longName)

Теперь имена переменных shortName и longName, слова больше не зарезервированы.

...