Когда я компилирую программу, изложенные ниже, я получаю следующее сообщение об ошибке (ы) назадОпределение внешней функции (модуль) в заголовочном файле в C
[[email protected] ~/I2C]$ make i2c_VIPER DEFINE=-DVIPER
gcc -g -Wall -D__USE_FIXED_PROTOTYPES__ -DVIPER -ansi -lusb -c -o i2c.o i2c.c
In file included from i2c.c:9:
viperboard.h:120: error: expected ‘)’ before ‘*’ token
i2c.c: In function ‘main’:
i2c.c:32: error: ‘usb_dev’ undeclared (first use in this function)
i2c.c:32: error: (Each undeclared identifier is reported only once
i2c.c:32: error: for each function it appears in.)
i2c.c:33: warning: implicit declaration of function ‘i2c_VIPER’
make: *** [i2c.o] Error 1
Я пробовал много вещей, более или менее полуслепую, чтобы заставить его работать. Определенный мной struct parsed_CLI_I2C_t
работает безупречно. Ошибок компиляции нет. Но, когда я пытаюсь использовать struct usb_device
от <usb.h>
эквивалентным образом, компилятор не доволен. Что я делаю неправильно?
Относительно детальное описание следующим образом.
Давайте начнем с фрагмента кода из стандартного #include
< usb.h> < - ссылка на полный файл заголовка
/* Data types */
struct usb_device;
struct usb_bus;
struct usb_device {
struct usb_device *next, *prev;
char filename[PATH_MAX + 1];
struct usb_bus *bus;
struct usb_device_descriptor descriptor;
struct usb_config_descriptor *config;
void *dev; /* Darwin support */
u_int8_t devnum;
unsigned char num_children;
struct usb_device **children;
};
Вот первый локальный файл заголовка #include «viperboard.h»
struct parsed_CLI_I2C_t;
extern int i2c_VIPER (struct usb_device **usb_dev, struct parsed_CLI_I2C_t **CLI_I2C_options);
extern bool OpenDevice(void);
Это второй локальный #include заголовочный файл "I2C.h"
typedef struct
{
char *USB_board;
int query;
int write_type;
} parsed_CLI_I2C_t;
extern int parse_CLI_I2C_options (int argc, char *argv[], parsed_CLI_I2C_t **CLI_I2C_options);
Основная программа выглядит следующим образом
/* all other standard include stuff skipped for brevity */
#include <usb.h>
#include "viperboard.h"
#include <stdbool.h>
#include "I2C.h"
int main(int argc, char *argv[])
{
parsed_CLI_I2C_t *CLI_I2C_options;
parse_CLI_I2C_options (argc, argv, &CLI_I2C_options);
struct usb_device *usb_dev;
i2c_VIPER (&usb_dev, &CLI_I2C_options);
}
и, наконец, это внешний модуль
i2c_VIPER.c
/* all other standard include stuff skipped for brevity */
#include <usb.h>
#include "viperboard.h"
#include <stdbool.h>
#include "I2C.h"
int i2c_VIPER (struct usb_device **usb_dev, struct parsed_CLI_I2C_t **CLI_I2C_options)
{
bool connected; /* True if the ViperBoard is connected */
connected = OpenDevice();
return(0);
}
Это
OpenDevice.c
#include <stdbool.h>
#include <usb.h>
bool OpenDevice() /* <---- this is line 11 */
{
usb_set_debug(0);
/* Initialize USB library */
usb_init();
etc etc etc
return true;
}
=== ================= ==================================== 30 минут: все предлагаемые изменения реализованы Другого типа ошибки появился.
OpenDevice.c:11: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘OpenDevice’
make: *** [OpenDevice.o] Error 1
Хорошо и быстро пятнистый. Если структура используется более чем в нескольких местах, я обычно делаю typedef: 'typedef struct usb_device usb_device_t'. Он часто выглядит более чистым, ИМО. – Gauthier
@Joachim Pileborg Я реализовал его в начальном посте, надеюсь, ВСЕ предлагаемые изменения. К сожалению, появилась еще одна ошибка. 'OpenDevice.c: 11: ошибка: ожидается,«=»,«»,«»,«ASM»или«__attribute__»перед«»OpenDevice марка: *** [OpenDevice.o] Ошибка 1' Пожалуйста, см. нижнюю часть исходного сообщения. – Igor
@Igor И вы включаете '', чтобы получить тип 'bool'? –