C,预处理器宏和GCC错误:“ ...之前的期望表达式”

时间:2018-10-30 18:29:06

标签: c makefile compiler-errors c-preprocessor

很久以前,我找到了libipfix,它是用C编写的IPFIX收集器。原始作者消失了,但是代码仍然可以在github上找到。我假设如果它在那儿,对其他人也有用。

当我尝试为特定子程序(example_collector_db)运行Makefile时,我收到来自GCC的“ expected expression before ...”消息,这对我来说没有太大意义。这是Makefile,尽管有很多删节:

CC = gcc
CCOPT = -Wall -g
INCLS = -I. -I.. -I../lib -I../libmisc
DEFS = -DHAVE_CONFIG_H
CFLAGS = $(CCOPT) $(INCLS) $(DEFS)
CPPFLAGS =
LDFLAGS =
LIBS =    -L../lib -L../libmisc -lipfix -lmisc

example_collector_db: example_collector_db.o Makefile
        $(CC) $(CFLAGS) $(CPPFLAGS) -o $@ example_collector_db.o $(LDFLAGS) $(LIBS)

但是当我运行make时,会发生以下情况:

root@myLinux:/home/me/libipfix_110209/examples# make example_collector_db
gcc -Wall -g -I. -I.. -I../lib -I../libmisc -DHAVE_CONFIG_H   -c example_collector_db.c
In file included from ../libmisc/misc.h:39:0,
                 from example_collector_db.c:54:
../libmisc/hashtable.h:6:1: error: expected expression before 'struct'
 struct hashtable;
 ^
Makefile:72: recipe for target 'example_collector_db.o' failed
make: *** [example_collector_db.o] Error 1
root@myLinux:/home/me/libipfix_110209/examples#

嗯。看起来代码正在尝试使用“ hashtable.h”头文件。当我看一下时,会看到以下内容:

  1  /* Copyright (C) 2002 Christopher Clark <firstname.lastname@cl.cam.ac.uk> */
  2  
  3  #ifndef __HASHTABLE_CWC22_H__
  4  #define __HASHTABLE_CWC22_H__
  5  
  6  struct hashtable;
  7  
  X  ...more code here...   
  X
166  #endif /* __HASHTABLE_CWC22_H__ */

因此,GCC似乎在抱怨第6行,我认为这是代码中其他地方的有效结构的原型(?)或签名(?)。但是我不禁要问,海湾合作委员会是否真的在抱怨第四行……不应该#define语句有另一个标记,例如:

  4  #define __HASHTABLE_CWC22_H__   12345   // or something...?

乍一看,我很想假设第4行是问题所在,并且在添加第三个令牌之前,此代码无法工作。但是写这篇文章的程序员比我先进得多。如果代码有这么简单的错误,这个项目如何在github上生存将近十五年?

请原谅本文的“合理性检查”性质...我希望这里有一些更高级的东西,我的中级经验可以忽略...

谢谢!

0 个答案:

没有答案