Синтаксическая ошибка при переносе кода C из Linux во FreeBSD - PullRequest
0 голосов
/ 15 июля 2010

Это очень озадачивает меня, потому что код компилируется без ошибок в системе Debian 5, но в FreeBSD 7 я получаю синтаксическую ошибку здесь, например, в строке 98.

int ipmi_fru_get_board_info_mfg_time(ipmi_fru_t   *fru, time_t *time);

Первоначально между * fru и time_t был разрыв строки. Не уверен, что может вызвать эти ошибки компилятора, но важно упомянуть разрыв строки.

Или этот из строки 298 остался полностью неизменным в своем формате.

int ipmi_fru_get(ipmi_fru_t                *fru,
     int                       index,
     char                      **name,
     int                       *num,
     enum ipmi_fru_data_type_e *dtype,
     int                       *intval,
     time_t                    *time,
     char                      **data,
     unsigned int              *data_len);

Это неизмененные ошибки, выводимые на терминал.

In file included from out_fru.c:37:
../include/OpenIPMI/ipmi_fru.h:98: error: expected declaration specifiers or '...' before 'time_t'
../include/OpenIPMI/ipmi_fru.h:298: error: expected declaration specifiers or '...' before 'time_t'
../include/OpenIPMI/ipmi_fru.h:474: error: expected declaration specifiers or '...' before 'time_t'
../include/OpenIPMI/ipmi_fru.h:559: error: expected declaration specifiers or '...' before 'time_t'
../include/OpenIPMI/ipmi_fru.h:627: error: expected declaration specifiers or '...' before 'time_t'

Последующие ошибки кажутся связанными, поскольку они влияют на функции, объявленные в приведенных выше строках заголовочного файла ipmi_fru.h.

out_fru.c: In function 'ipmi_cmdlang_dump_fru_info':
out_fru.c:87: warning: passing argument 7 of 'ipmi_fru_get' from incompatible pointer type
out_fru.c:87: warning: passing argument 8 of 'ipmi_fru_get' from incompatible pointer type
out_fru.c:87: error: too many arguments to function 'ipmi_fru_get'

Что может быть причиной этих странных синтаксических ошибок платформы? Моей первой мыслью был какой-то непечатаемый символ, но я попытался проверить с помощью команды cat -e include / OpenIPMI / ipmi_fru.h | меньше я вижу только пробелы и разрывы строк.

Ответы [ 3 ]

1 голос
/ 15 июля 2010

Ну, вы / автор оригинала должны были включить файл с заголовком, где time_t определено после успешной компиляции. Однако вам необходимо правильно найти файл, чтобы узнать правильное решение проблемы.

Вы просто не можете предположить, что Linux не требует, чтобы вы включили файл, который потрясает все основы программирования:).

1 голос
/ 15 июля 2010

В этих типах загадочных ошибок лучше всего запускать препроцессор самостоятельно и смотреть, что получится. Иногда токен #define d где-то в заголовках, и становится почти невозможно узнать, что происходит.

Чтобы сделать это, найдите строку компиляции для этого файла .c и запустите ее как:

cpp <all -I switches from the compilation line> <all -D switches> yourfile.c outfile.tmp

Попробуйте найти соответствующую строку в outfile.tmp - она ​​может выглядеть немного грязно, но найдите оригинальное имя файла и номер белья - это не должно быть слишком сложно Когда вы найдете эту строку, мы надеемся, что найти настоящую проблему не составит труда.

0 голосов
/ 15 июля 2010

Пользователь Praveen хорошо ответил на мой вопрос, но просто чтобы я не оставил ветку без ответа, я упомяну то, что обнаружил.

Программное обеспечение, похоже, определяет свой собственный time_t, либо Linux, либо не требует, чтобы вы включали time.h для типа данных time_t.

В любом случае мне удалось продолжить портирование, просто включив time.h во FreeBSD.

...