【问题标题】:New to C... getting "UArray2.h:19: error: expected ‘)’ before ‘*’ token" on an unfinished function declarationC 新手...在未完成的函数声明中获取“UArray2.h:19: error: expected ‘)’ before ‘*’ token”
【发布时间】:2012-09-18 15:19:26
【问题描述】:

我正在为学校做一个 CS 项目,但我似乎遇到了这个非常无用的奇怪错误。我和我的搭档似乎无法弄清楚。

它在第一个'*'标记之前显示“UArray2.h:18: error: expected '=', ',', ';', 'asm' or 'attribute' before '*' token”函数声明我的 .h 文件 (UArray2_new)。

在函数声明的每一行中,在‘*’标记之前重复“错误:预期的‘)’。有任何想法吗?我在我的里面包含了一个空白的 main,所以你可以看到它不可能是一个编译问题。我使用“gcc -Wall -Wextra -Werror UArray2.c”进行编译。

//UArray2.h                                                                  
#include <stdlib.h>
#include <stdio.h>


#ifndef UARRAY2_INCLUDED
#define UARRAY2_INCLUDED

struct UArray2_T{
    int width, height;                                                     
};   

extern UArray2_T * UArray2_new(int height, int width, int size);
extern void UArray2_free(UArray2_T * uarray2);                                                                
extern void * UArray2_at(UArray2_T * uarray2, int column, int row);
extern int UArray2_size(UArray2_T * uarray2);
extern int UArray2_columns(UArray2_T * uarray2);
extern int UArray2_rows(UArray2_T * uarray2);
static int UArray2_index(UArray2_T * uarray2, int col, int row);

#endif

这是 .c 文件

//UArray.c                                                                          
#include <stdlib.h>
#include <stdio.h>
#include "UArray2.h"                                                             

int main()
{

     return 0;
}

UArray2_T * UArray2_new(int height, int width, int size)
{
    T newArray=malloc(sizeof(UArray2_T));
    newArray->height=height;
    newArray->width=width;
    (void) size;                            
    return newArray;
}

void UArray2_free(UArray2_T * uarray2)
{
    (void) uarray2;
    //need to write                                                                 

}

void * UArray2_at(UArray2_T * uarray2, int column, int row)
{

    (void) uarray2;
    int index=UArray2_index(uarray2, column, row);
    (void) index;
    //if(index>0 && index<=column*row)                                              
    //return UArray_at(uarray2->UArray, index);                                     
    //else                                                                          
    //throw an error                                                                
    char * k="hi"; //dummy variables
    return k;
}

int UArray2_size(UArray2_T * uarray2)
{
    //UArray_size(uarray2->UArray);                                                 
    return 0;
}
int UArray2_columns(UArray2_T * uarray2){
    return uarray2->width;
}

【问题讨论】:

    标签: c struct


    【解决方案1】:

    在您拥有UArray2_T * 的任何地方,您都应该将其替换为struct UArray2_T *。当您引用 struct 类型时,C 需要 struct 关键字(但在 C++不是)。

    避免这种情况的标准方法是使用typedef,例如:

    typedef struct {
        int width, height;                                                     
    } UArray2_T;
    

    【讨论】:

      【解决方案2】:

      在 C 语言中,struct Foo 是否 引入了一个名为 Foo 的新类型。该类型称为struct Foo

      您可以为类型名称创建别名,如下所示:

      typedef struct UArray2_T UArray2_T;
      

      这样做应该可以解决您的错误。

      【讨论】:

      • @ManVsCode 不,在 C99 中,他还会缺少 structtypedef。这部分语言没有改变。
      • 请原谅,但是这个建议让他创建了丑陋的代码......@unwind
      【解决方案3】:

      我会将结构移至 .c 文件。这将隐藏结构的内部结构。

      struct UArray2_T { // move to the .c file
          int width, height;                                                     
      };
      

      向 .h 文件添加前向声明,如下所示:

      struct UArray2_T;
      

      【讨论】:

      • ... 并将所有函数声明更改为使用 struct UArray2_T 但仅使用 UArray2_T
      【解决方案4】:

      你需要 typedef 你的结构,或者在任何地方使用 struct 关键字。我喜欢这种风格:

      typedef struct {
          int data1;
          char data2;
      } newtype;
      

      【讨论】:

        猜你喜欢
        • 2014-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-18
        • 2016-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多