C, макрос препроцессора и ошибка GCC: «ожидаемое выражение перед ...» - PullRequest
0 голосов
/ 30 октября 2018

Я давно нашел libipfix, сборщик IPFIX, написанный на C. Первоначальные авторы исчезли, но код все еще доступен на github. Я предполагаю, что если это там, это сработало для других людей.

Когда я пытаюсь запустить Makefile для определенной подпрограммы (example_collector_db), я получаю сообщение "ожидаемое выражение до ..." от GCC, которое не имеет большого смысла для меня. Вот 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, которую я считаю прототипом (?) Или подписью (?) Допустимой структуры где-то еще в коде. Но я не могу не задаться вопросом, действительно ли GCC жалуется на строку 4 ... разве это утверждение #define не должно иметь другого токена, например:

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

На первый взгляд, у меня возникает соблазн предположить, что проблема заключается в строке 4, и этот код не может работать, пока не добавлен третий токен. Но кодер, который написал это, намного более продвинут, чем я. И как этот проект мог жить на github в течение почти пятнадцати лет, если в коде была такая простая ошибка?

Простите за характер "проверки здравомыслия" этого поста ... Я надеюсь, что здесь есть что-то более продвинутое, что пропускает мой опыт среднего уровня ...

Спасибо!

...