2012-11-01 5 views
0

У меня возникли проблемы с пониманием файлов заголовков c и исходных файлов. У меня есть:создание библиотеки: конфликтующие типы в заголовке и исходном файле

something.c

#include <stdio.h> 
#include "something.h" 

typedef struct { 
    int row, col; 
} point; 

point 
whereispoint(point **matrix, int rows, int cols) 
{ 
    ..... Does something .... 
    printf("something..."); 
} 

something.h

typedef struct point * p; 

p whereispoint(p **matrix, int rows, int cols); 

main.c

#include <stdio.h> 
#include "something.h" 

int 
main(void) 
{ 
    int row, col; 
    p **matrix=malloc(bla, bla); 
    .....Something..... 
    p=whereispoint(matrix, row, col); 
    return 0; 
} 

Теперь, когда я на самом деле не знать ho ж компилировать ... Я попытался gcc -c main.c something.c , но это не работает, я попытался собрать отдельно gcc -c main.c и gcc -c something.c затем main.c работает, но something.c не делает.

Я на самом деле пытаюсь создать библиотеку из something.c, но поскольку я не могу даже скомпилировать ее в объектный код, я не знаю, что делать. Я предполагаю, что есть что-то не так с типом структуры и ЬурейеЕ его в something.h, но я не могу понять, что ...

ответ

2

В заголовке, функция whereispoint() является объявить как возвращающая struct point* (typedef p), но определение возвращает struct point, а не указатель.

Лично я нахожу typedef указателей запутанными и думаю, что это яснее в коде, если * используется для обозначения указателя:

/* header */ 
typedef struct point point_t; 

point_t* whereispoint(point_t** matrix, int rows, int cols); 

/* .c */ 
struct point { 
    int row, col; 
}; 

point_t* whereispoint(point_t** matrix, int rows, int cols) 
{ 
    ..... Does something .... 
    printf("something..."); 
    return ??; 
} 
0

Следующими:

typedef struct { 
    int row, col; 
} point; 

определения типов безымянной-структуры для тип точки.

В something.h вы затем typedef «struct point» (неопределенная ссылка типа структуры) на «* p».

Как правило, вы должны определить все свои «типы интерфейсов» в файле заголовка, вместо того чтобы пытаться скрыть реализацию (C должен знать реализацию для доступа к чему-либо).

Попробуйте сделать что-то подобное в something.h:

typedef struct point { 
    int row, col; 
} *p; 

Или, если вы не знаете точно, как работают определения типов, просто сделать:

struct point { 
    int row, col; 
} 

, объявляющий тип структуры.

+0

Нет ничего плохого в непрозрачном типе. Если вызывающим абонентам функции не нужно знать, что внутри структуры, зачем делать ее общедоступной? C нужно только знать реализацию внутри функций, которые управляют экземплярами структуры. Решение от @hmhd лучше. –

+0

@WilliamMorris - Нет, нет ничего плохого в непрозрачных типах. В стандартной библиотеке C имеется довольно мало непрозрачных типов.Но если вы не хотите писать подходящие аксессуры и приходить в боль, чтобы удостовериться, что user никогда не должен ПОТРЕБИТЬСЯ о вашем непрозрачном типе, лучше просто не делать этого. – Vatine

Смежные вопросы