如何在字符串参数前修复“错误:预期;或”)

时间:2019-09-20 16:23:23

标签: c shell compiler-errors malloc expected-condition

我们正在尝试为我们的项目在c中实现bash shell。现在,我正在基于AddToken函数(填充我们的strArray结构)创建一个函数addAlias及其。

strArray结构具有** char(字符串数组)和int以表示数组中标记的数量。 同样,aliasArray结构具有两个** char和一个表示别名数量的int。实现几乎是相同的,所以我不知道addAlias函数的错误来自哪里。

我已经尝试搜索Stack,并移动代码,但是我不知道是什么原因造成的。

这来自头文件:

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.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 个答案:

答案 0 :(得分:4)

char* shortchar* long是问题。 shortlong是C语言中的类型名称。您应该使用另一个参数名称。

答案 1 :(得分:1)

shortlong是C语言中的保留字(例如intvoid)。

您不能将它们用作变量名。

建议的更改:

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

现在变量名分别为shortNamelongName,不再保留字。

答案 2 :(得分:1)

根据C标准(6.4.1关键字)

  

2上面的标记(区分大小写)被保留(翻译   阶段7和8)用作关键字,否则不能使用 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)

否则,函数声明将使函数的用户感到困惑,并且尽管函数不会更改相应的字符串,但不能接受常量指针。