2013-09-17 3 views
0

Когда я компилирую программу, изложенные ниже, я получаю следующее сообщение об ошибке (ы) назадОпределение внешней функции (модуль) в заголовочном файле в 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 

ответ

2

Эта линия

usb_device *usb_dev; /* this is line 32 */ 

не будет работать, как вы собираете программу C, а не программа C++. В структурах C автоматически не создаются, как на C++. Вы должны использовать ключевое слово struct объявить структуры:

struct usb_device *usb_dev; /* this is line 32 */ 

Это изменение, которое вы должны сделать для каждого места, где вы используете структуры, например, как декларацию и определение функции i2c_VIPER.

Также обратите внимание, что для типа bool для работы вам необходимо включить <stdbool.h>.

+1

Хорошо и быстро пятнистый. Если структура используется более чем в нескольких местах, я обычно делаю typedef: 'typedef struct usb_device usb_device_t'. Он часто выглядит более чистым, ИМО. – Gauthier

+0

@Joachim Pileborg Я реализовал его в начальном посте, надеюсь, ВСЕ предлагаемые изменения. К сожалению, появилась еще одна ошибка. 'OpenDevice.c: 11: ошибка: ожидается,«=»,«»,«»,«ASM»или«__attribute__»перед«»OpenDevice марка: *** [OpenDevice.o] Ошибка 1' Пожалуйста, см. нижнюю часть исходного сообщения. – Igor

+0

@Igor И вы включаете '', чтобы получить тип 'bool'? –