免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4199 | 回复: 10

[C] 用GCC编译Makefile写的代码老是报错,请各位帮忙看下,这个问题困惑了我很久 [复制链接]

论坛徽章:
0
发表于 2009-10-25 12:12 |显示全部楼层
10可用积分
我是想把所有的函数分别保存在一个单独的文件里面,因为这些函数我以后另外的程序都要用,而我又不想在重复写这些函数,可是运行make命令编译时就一直报错:
frank@ubuntu:~/ccode$ make
gcc -c main.c
gcc -c creatEmptyStack_link.c
creatEmptyStack_link.c:2: 错误: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
make: *** [creatEmptyStack_link.o] 错误 1
这是我在ubuntu 下编译的。我后来仔细检查了代码,没有错,因为我将所有的函数放在一个文件里面编译运行就能通过,结果也是正确的。请问这是怎么回事,如何解决?在此小弟先谢谢各位,以解我燃眉之急.............
代码如下:
//mheader.h
#include <stdio.h>

#include <stdlib.h>

#include <malloc.h>


//栈的链表定义

typedef struct Node  /*单链表结点结构*/

{

char info;

struct Node *link;

}Node;


typedef struct LinkStack  /*链接栈类型定义*/

{

struct Node *top;      /*指向栈顶结点*/

}LinkStack,*PLinkStack;


//队列的链表表示

typedef struct LinkQueue

{

struct Node *f;

struct Node *r;

}LinkQueue,*PLinkQueue;

//creatEmptyStack_link.c
//创建一个空链栈

PLinkStack creatEmptyStack_link(void)

{

PLinkStack plstack;

plstack=(PLinkStack)malloc(sizeof(struct LinkStack));

if(plstack!=NULL)

   plstack->top=NULL;

else

   printf("Out of space!\n");



return plstack;

}

//creatEmptyQueue_link.c
//创建一个空队列

PLinkQueue creatEmptyQueue_link(void)

{

PLinkQueue plqu;

plqu=(PLinkQueue)malloc(sizeof(struct LinkQueue));



if(plqu!=NULL)

        {

                plqu->f=NULL;

                plqu->r=NULL;

        }

else         printf("Out of space!\n");



return plqu;

}

//deQueue_link.c
//出队列

void deQueue_link(PLinkQueue plqu)

{

struct Node *p;



if(plqu->f==NULL)

        printf("Empty queue.\n");

else

{

        p=plqu->f;

          plqu->f=plqu->f->link;

          free(p);

}

}


//enQueue_link.c
//进队列

void enQueue_link(PLinkQueue plqu,char x)

{

struct Node *p;



p=(struct Node *)malloc(sizeof(struct Node));



if(p==NULL)         printf("Out of space!");

else

        {

                p->info=x;

                p->link=NULL;

                if(plqu->f==NULL)

                {

                 plqu->f=p;

                 plqu->r=p;       

                }

                     else

                {

                 plqu->r->link=p;               

                 plqu->r=p;

                }

        }

}

//frontQueue_link.c
//取队列的头元素

char frontQueue_link(PLinkQueue plqu)

{  return (plqu->f->info);  }

//pop_link.c
//出栈
void pop_link(PLinkStack plstack)

{

struct Node *p;



if(isEmptyStack_link(plstack))

        printf("Empty stack pop.\n");

else

        {

                p=plstack->top;

                plstack->top=plstack->top->link;

                free(p);

        }

}

//push_link.c
//进栈

void push_link(PLinkStack plstack,int x)

{

  struct Node *p;



  p=(struct Node *)malloc(sizeof(struct Node));

  if(p==NULL)

        printf("Out of space!\n");

  else

        {

                p->info=x;

                p->link=plstack->top;

                plstack->top=p;

        }

}


//top_link.c
//取栈顶元素

char top_link(PLinkStack plstack)

{

return (plstack->top->info);

}

//main.c
//检查一段字符是否是回文
#include "mheader.h"

PLinkStack creatEmptyStack_link(void);
char top_link(PLinkStack plstack);
void push_link(PLinkStack plstack,int x);
void pop_link(PLinkStack plstack);

PLinkQueue creatEmptyQueue_link(void);
char frontQueue_link(PLinkQueue plqu);
void enQueue_link(PLinkQueue plqu,char x);
void deQueue_link(PLinkQueue plqu);


int main()
{
    char c;
    int i,j;
    PLinkStack pal;
    PLinkQueue pau;

    pal=creatEmptyStack_link();
    pau=creatEmptyQueue_link();

        c=getchar();
        i=1;
    while(c!='#')
    {
        push_link(pal,c);
        enQueue_link(pau,c);
        c=getchar();
        i++;
    }


    for(j=0;j<i-1;j++)
    {
            if(frontQueue_link(pau)==top_link(pal))
                    {
                                deQueue_link(pau);
                                pop_link(pal);
                                c=1;
                    }
            else
                    c=-1;
    }
    if(c==1)printf("是回文\n");
        else
                printf("不是回文\n");
       
       
        return 0;
}

//Makefile
main:main.o creatEmptyStack_link.o top_link.o push_link.o pop_link.o creatEmptyQueue_link.o frontQueue_link.o enQueue_link.o deQueue_link.o
        gcc -o $@ $^
main.o:main.c mheader.h
        gcc -c $<
creatEmptyStack_link.o:creatEmptyStack_link.c
        gcc -c $<
top_link.o:top_link.c
        gcc -c $<
push_link.o:push_link.c
        gcc -c $<
pop_link.o:pop_link.c
        gcc -c $<
creatEmptyQueue_link.o:creatEmptyQueue_link.c
        gcc -c $<
frontQueue_link.o:frontQueue_link.c
        gcc -c $<
enQueue_link.o:enQueue_link.c
        gcc -c $<
deQueue_link.o:deQueue_link.c
        gcc -c $<
.PHONY:clean
clean:
        rm *.o main

[ 本帖最后由 zijuan0810 于 2009-10-26 12:47 编辑 ]

源代码.zip

4.3 KB, 下载次数: 48

最佳答案

查看完整内容

to lz:1:除了main.c中,其它的*.c都是加#include "mheader.h"2:frontQueue_link.c文件中的isEmptyStack_link函数你忘记写了吧此外:你每个函数都用一个文件来书写,而它们都是实现同个链表栈的功能的某一个部分。在实现开发中,理当合在一个.h,.c文件中就可以了。

论坛徽章:
0
发表于 2009-10-25 12:12 |显示全部楼层
to lz:
1:除了main.c中,其它的*.c都是加#include "mheader.h"
2:frontQueue_link.c文件中的isEmptyStack_link函数你忘记写了吧

此外:你每个函数都用一个文件来书写,而它们都是实现同个链表栈的功能的某一个部分。
在实现开发中,理当合在一个.h,.c文件中就可以了。

论坛徽章:
0
发表于 2009-10-25 13:45 |显示全部楼层

回复 #1 zijuan0810 的帖子

看不懂,,,帮你顶起

论坛徽章:
0
发表于 2009-10-25 13:57 |显示全部楼层
除了 main.c 外,你其它几个 .c 文件也要 #include  "mheader.h",因为它们也要了解你自定义的结构。

[ 本帖最后由 retuor 于 2009-10-25 14:07 编辑 ]

论坛徽章:
0
发表于 2009-10-25 16:25 |显示全部楼层
建议把源代码文件和makefile文件上传上来,大家可以帮你分析分析,拷贝代码还得赋值粘贴

论坛徽章:
0
发表于 2009-10-25 19:17 |显示全部楼层

回复 #3 retuor 的帖子

用你说的方法,也不可以。我全部都加上了#include "mheader.h",结果还是一样的报同样的错误。这该怎么办?

论坛徽章:
0
发表于 2009-10-25 19:23 |显示全部楼层
最好把全部文件打包传上来。如果不想,试一下:

cc -c xxx.c

看那个c 文件出问题,把那个文件和头文件打包传上来。

论坛徽章:
0
发表于 2009-10-25 19:24 |显示全部楼层
看一下关于多文件编程,也就是工程文件如何组织的材料。

论坛徽章:
0
发表于 2009-10-25 19:30 |显示全部楼层
与retuor观点相同,类似这样的错误在编译的时候时有发生,通常是所需找不到。。。。

论坛徽章:
0
发表于 2009-10-25 21:19 |显示全部楼层
creatEmptyStack_link.c:2: 错误: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token

这种语法错误大多是因为 * 前面的自定义类型在这个.c文件里不可见。你要确认这个自定义类型在哪个文件里定义以及这个文件是否被正确地#include进来了。不正确地#include,比如在防止二重包含的时候两个不同的.h文件用了同样的标识符。

//a.h
#ifndef a_h
#define a_h
..
#endif

//b.h
#ifndef a_h    //which should be b_h
#define a_h   //which should be b_h
...
#endif a_h     // which should be b_h

//a.c
#include "a.h"
#include "b.h"

这个时候b.h里面定义的类型在编译a.c的时候就会出现上面的编译错误

greetings.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP