Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Доступ к типу без подключения .h, незнаю как правильно спросить 
:(
    Опции темы
cupper
Дата 23.4.2010, 18:02 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



Есть хедер
proc_fs.h
Код

typedef    int (read_proc_t)(char *page, char **start, off_t off,
              int count, int *eof, void *data);


мне нужно в другом хедере
my.h
определить функцию с использованием этого типа но без явного подключение этого хедера
Код

long func(..., read_proc_t *read_proc, ...);

Мне выдает ошибку
Код

error: expected declaration specifiers or '...' before 'read_proc_t'

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

Это сообщение отредактировал(а) cupper - 23.4.2010, 18:03
PM MAIL   Вверх
GoldFinch
Дата 23.4.2010, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



cupper, просто скопируйте этот typedef
PM MAIL ICQ   Вверх
Sartorius
Дата 23.4.2010, 18:07 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



Цитата(cupper @  23.4.2010,  19:02 Найти цитируемый пост)
Явно я немогу подключить этот хедер сюда, может зацикленный произойти.

Используйте стражи включения или #pragma once

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

Это сообщение отредактировал(а) Sartorius - 23.4.2010, 18:10
PM MAIL ICQ   Вверх
cupper
Дата 23.4.2010, 18:13 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



Цитата(GoldFinch @ 23.4.2010,  18:06)
cupper, просто скопируйте этот typedef

если скопировать пишет что два раза определено, в моем и в первой хедере.

Добавлено через 1 минуту и 19 секунд
Цитата(Sartorius @ 23.4.2010,  18:07)
Используйте стражи включения или #pragma once

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

это уже готовый проект в который не стоит вносить #pragma once, какой есть дизайн с таким приходится работать.

Добавлено через 6 минут и 50 секунд
скопировал tipedef но изменил его на 
Код

typedef    int (myread_proc_t)(char *page, char **start, off_t off,
              int count, int *eof, void *data);

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

И вообще свяжетли комплятор реализацию функции в .с если у нее будет тип read_proc_t с ее определение в .h если там будет тип myread_proc_t ???
PM MAIL   Вверх
Sartorius
Дата 23.4.2010, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



Ну назовите тип по другому. Какая разница как он назыается, вам же надо просто в func корректно стек этой функции заполнить и вызвать ее. Не понимаю почему нельзя добавлять директивы компилятора, а тип копипастить можно
PM MAIL ICQ   Вверх
cupper
Дата 23.4.2010, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



Цитата(Sartorius @ 23.4.2010,  18:22)
Не понимаю почему нельзя добавлять директивы компилятора, а тип копипастить можно

директивы не добавляю потому что незнаю что получиться, а все что не знаю не делаю. 
Забыл указать что язык С, компилятор gcc.
Скопировать тапйдеф это крайняя мера, и то я не знаю точно что получится. 
А изначально я хотел узнать как можно определенный таким образом тип данных объявить прототипом в другом файле, по типу как делают со структурами
в одном файле ее описывают, в другом просто определяют struct xyz;
Или как функции extern'ом... в общем хотел узнать можно ли в моем случае сделать что то подобное (без доп директив и копипаста)
PM MAIL   Вверх
Earnest
Дата 23.4.2010, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Стражи включения типа #ifndef __MY_HEADER точно ничего не испортят. Более того, их не обязательно вносить сразу во все хедеры, можно по мере необходимости. 


--------------------
...
PM   Вверх
cupper
Дата 23.4.2010, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



Цитата(Earnest @ 23.4.2010,  19:46)
Стражи включения типа #ifndef __MY_HEADER точно ничего не испортят. Более того, их не обязательно вносить сразу во все хедеры, можно по мере необходимости.

хммм, ну так они и есть в обоих, в каждом свой.
PM MAIL   Вверх
mes
Дата 23.4.2010, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(cupper @  23.4.2010,  17:13 Найти цитируемый пост)
поправил в определении функции, т

зачем поправлять ? два одинаковых тайпдефа не будут конфликтовать.. 

Цитата(cupper @  23.4.2010,  17:13 Найти цитируемый пост)
И вообще свяжетли комплятор реализацию функции в .с если у нее будет тип read_proc_t с ее определение в .h если там будет тип myread_proc_t ??? 

typedef  определяет не новый тип, a псевдоним, т.е. в определение ссылается на главный тип. 

Цитата(cupper @  23.4.2010,  17:34 Найти цитируемый пост)
Скопировать тапйдеф это крайняя мера, и то я не знаю точно что получится. 

будет порядок smile





--------------------
PM MAIL WWW   Вверх
cupper
Дата 23.4.2010, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



Цитата(mes @ 23.4.2010,  21:27)
зачем поправлять ? два одинаковых тайпдефа не будут конфликтовать.. 

значит я чего то не понимаю, я уже говорил что копировал typedef и это тоже вызывало ошибку, вот она
Код

include/linux/proc_fs.h:48: error: redefinition of typedef 'read_proc_t'
include/linux/syscalls.h:852: note: previous declaration of 'read_proc_t' was here

PM MAIL   Вверх
mes
Дата 23.4.2010, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(cupper @  23.4.2010,  20:47 Найти цитируемый пост)
значит я чего то не понимаю, я уже говорил что копировал typedef и это тоже вызывало ошибку, вот она

проверил в С++ нет ошибки, а в С действительно нельзя..   :(



--------------------
PM MAIL WWW   Вверх
mes
Дата 23.4.2010, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(cupper @  23.4.2010,  17:02 Найти цитируемый пост)
Явно я немогу подключить этот хедер сюда, может зацикленный произойти.

кстати как может произойти зацикливание, когда proc_fs по отношению к вашему файлу библиотечный ?

Добавлено через 1 минуту и 34 секунды
Цитата(cupper @  23.4.2010,  20:47 Найти цитируемый пост)
include/linux/proc_fs.h:48: error: redefinition of typedef 'read_proc_t'
include/linux/syscalls.h:852: note: previous declaration of 'read_proc_t' was here


и почему у Вас redefinition в библиотечных файлах ? или Вы "свой линукс" пишете ?


--------------------
PM MAIL WWW   Вверх
mes
Дата 23.4.2010, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



если действительно включать файл proc_fs нельзя, а тайпдеф нужен, то как решение вижу :

Код

// my.h

#ifndef _LINUX_PROC_FS_H  // проверка включения proc_fs.h

typedef    int (read_proc_t)(char *page, char **start, off_t off,
              int count, int *eof, void *data);

#endif  




--------------------
PM MAIL WWW   Вверх
cupper
Дата 23.4.2010, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



Цитата(mes @ 23.4.2010,  22:23)
кстати как может произойти зацикливание, когда proc_fs по отношению к вашему файлу библиотечный ?

и почему у Вас redefinition в библиотечных файлах ? или Вы "свой линукс" пишете ?

они оба библиотечные, в одном определен необходимый тип (до меня), в другом определяю необходимую функцию (я). Долго описывать почему именно так.

Добавлено через 2 минуты и 39 секунд
Цитата(mes @ 23.4.2010,  22:40)
если действительно включать файл proc_fs нельзя, а тайпдеф нужен, то как решение вижу :

Код

// my.h

#ifndef _LINUX_PROC_FS_H  // проверка включения proc_fs.h

typedef    int (read_proc_t)(char *page, char **start, off_t off,
              int count, int *eof, void *data);

#endif  


получится следующее:
в этом файле не будет определна _LINUX_PROC_FS_H, добавиться необходимый мне typedef но при общей линковке опять таки возникнет два одинаковых определение.
PM MAIL   Вверх
mes
Дата 23.4.2010, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(cupper @  23.4.2010,  22:06 Найти цитируемый пост)
получится следующее:

ну тогда (раз у вас доступ к сорцам) пока не пришли сишники и не прояснили как в таких случаях поступать, вынесите определение тайпдефа в отдельный файл и включайте уже его куда надо.. smile

Добавлено через 45 секунд
или можно подумать, как избавиться от зацикливания..



--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0761 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.