#include в Си (заинклюдился)

Модератор: Модераторы разделов

Аватара пользователя
newsrc
Сообщения: 314
ОС: Slackware

#include в Си

Сообщение newsrc »

В mail.c:

Код: Выделить всё

#include <stdlib.h>
#include "sortline.h"
.....


Код функции qsort() в файле sort.c

В обоих инклюдах есть прототипы функции qsort()
Конечно они не совпадают и я получаю conflicting types for 'qsort' sortline.h

Мне нужно в main.c использовать другие функции из <stdlib.h>, а из "sortline.h" мой вариант функции qsort().

Видимо решается с помощью препроцессорных директив.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: #include в Си

Сообщение watashiwa_daredeska »

newsrc писал(а):
18.08.2010 13:17
Видимо решается с помощью препроцессорных директив.
Решается переименованием своей qsort.
Спасибо сказали:
Аватара пользователя
newsrc
Сообщения: 314
ОС: Slackware

Re: #include в Си

Сообщение newsrc »

watashiwa_daredeska писал(а):
18.08.2010 13:21
Решается переименованием своей qsort.

Конечно решается.
А без переименования. Что-то типа: #undef
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: #include в Си

Сообщение watashiwa_daredeska »

newsrc писал(а):
18.08.2010 13:23
А без переименования. Что-то типа: #undef
А без переименования никак. #undef не поможет: qsort -- не макрос.
Спасибо сказали:
Аватара пользователя
newsrc
Сообщения: 314
ОС: Slackware

Re: #include в Си

Сообщение newsrc »

Прекрасно понимаю, что qsort() не макрос, а функция, поэтому я и написал "что-то типа #undef"
Это принципиально возможно без переименования?
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: #include в Си

Сообщение NickLion »

Код: Выделить всё

#define qsort std_qsort
#include <stdlib.h>
#undef qsort
#include "sortline.h"

Но я бы за такое по рукам бил ;)
Спасибо сказали:
Аватара пользователя
Voral
Сообщения: 1205
ОС: Debian Wheezy (amd64)

Re: #include в Си

Сообщение Voral »

NickLion писал(а):
18.08.2010 13:57

Код: Выделить всё

#define qsort std_qsort
#include <stdlib.h>
#undef qsort
#include "sortline.h"

Но я бы за такое по рукам бил ;)

Жесть......

То ТС. У вас есть причины не переименовывать свою ф-ию или просто "лень много править во многих файлах"? Ведь легче один раз выполнить одну команду для переименования по всем файлам, чем потом путаться....

Но это, конечно же, имхо?
То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me © ?
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: #include в Си

Сообщение NickLion »

// offtopic
Voral писал(а):
18.08.2010 14:34
Жесть......

Не-не-не. Жесть (правда для C++) это:

Код: Выделить всё

#define private public
#include <X.h>
#undef private
Спасибо сказали:
Аватара пользователя
newsrc
Сообщения: 314
ОС: Slackware

Re: #include в Си

Сообщение newsrc »

Не лень. Проблем в этом нет. Мне просто стало интересно.
Спасибо.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: #include в Си

Сообщение frp »

Для всех, говорящих что C++ не тру а C тру (не знаю, есть ли такие на этом форуме, но на других есть и много): в c++ эта проблема решается элементарно. А все решения этой проблемы на C (кроме переименования функции) являются грязными хаками.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: #include в Си

Сообщение t.t »

frp писал(а):
18.08.2010 17:20
Для всех, говорящих что C++ не тру а C тру (не знаю, есть ли такие на этом форуме, но на других есть и много): в c++ эта проблема решается элементарно. А все решения этой проблемы на C (кроме переименования функции) являются грязными хаками.
C и C++ это довольно-таки разные языки. Поэтому и сравнивать их на примере конкретных мелочей (а этот вопрос — именно мелочь) не стоит. В качестве иллюстрации могу продожить ряд «в C накладки с именами приводят к проблемам» — «в C++ эти проблемы решаются штатными средствами»: в Lisp вообще допустимы безымянные «функции». (:
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: #include в Си

Сообщение Nazyvaemykh »

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

Ужь коль скоро функция qsort определена в стандарте языка, при чтении кода будет неожиданностью, если иденитификатор qsort обозначает что-то другое.
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: #include в Си

Сообщение Portnov »

Ага. А то сразу вспоминается PL/1 и некоторые современные ему языки, где не было понятия 'ключевого слова', и имена функций/переменных могли совпадать с управляющими конструкциями. Так что код типа

Код: Выделить всё

IF THEN<IF THEN ELSE ELSE THEN

был валидным :)
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
Фантом
Сообщения: 460
ОС: openSUSE

Re: #include в Си

Сообщение Фантом »

frp писал(а):
18.08.2010 17:20
Для всех, говорящих что C++ не тру а C тру (не знаю, есть ли такие на этом форуме, но на других есть и много): в c++ эта проблема решается элементарно. А все решения этой проблемы на C (кроме переименования функции) являются грязными хаками.

Да, но только отсутствие легкой возможности решить подобную "проблему" и является одним из признаков более правильного языка (еще лучше было бы полное отсутствие возможности, но на безрыбье и рак - рыба). :crazy:
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: #include в Си

Сообщение NickLion »

Фантом писал(а):
18.08.2010 19:45
Да, но только отсутствие легкой возможности решить подобную "проблему" и является одним из признаков более правильного языка (еще лучше было бы полное отсутствие возможности, но на безрыбье и рак - рыба). :crazy:

надеюсь это шутка... потому что namespace - это замечательная вещь, как ни крути
Спасибо сказали:
Аватара пользователя
newsrc
Сообщения: 314
ОС: Slackware

Re: #include в Си

Сообщение newsrc »

Nazyvaemykh писал(а):
18.08.2010 18:08
При этом в любом языке, даже там, где есть возможность сделать это легко, вводить собственные функции/типы/классы с именами, совпадающими со стандартными, нужно лишь с очень большой осторожностью.

Ужь коль скоро функция qsort определена в стандарте языка, при чтении кода будет неожиданностью, если иденитификатор qsort обозначает что-то другое.

Да, не стоит заниматься такими вещами, сам потом будешь вспоминать "почему именно так"...




Фантом писал(а):
18.08.2010 19:45
Да, но только отсутствие легкой возможности решить подобную "проблему" и является одним из признаков более правильного языка (еще лучше было бы полное отсутствие возможности, но на безрыбье и рак - рыба). :crazy:

В этом что-то есть.


Похоже тут скоро холивар начнётся.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: #include в Си

Сообщение Nazyvaemykh »

Фантом писал(а):
18.08.2010 19:45
Да, но только отсутствие легкой возможности решить подобную "проблему" и является одним из признаков более правильного языка (еще лучше было бы полное отсутствие возможности, но на безрыбье и рак - рыба). :crazy:

Расширить язык так, чтобы он был наиболее выразительным для описания конкретной задачи — разве это грязный хак? Нет, многие языки заточены именно под то, чтобы быть такими вот расширяемыми.
То, что в одном языке нежелательно, делает другой жемчужиной.
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
Фантом
Сообщения: 460
ОС: openSUSE

Re: #include в Си

Сообщение Фантом »

Nazyvaemykh писал(а):
19.08.2010 11:29
Расширить язык так, чтобы он был наиболее выразительным для описания конкретной задачи — разве это грязный хак? Нет, многие языки заточены именно под то, чтобы быть такими вот расширяемыми.
То, что в одном языке нежелательно, делает другой жемчужиной.

Не спорю, но я писал несколько о другом: для того, кто считает C хорошим языком, а C++ - плохим, аргумент frp верен "с точностью до наоборот".
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: #include в Си

Сообщение frp »

Фантом писал(а):
18.08.2010 19:45
Да, но только отсутствие легкой возможности решить подобную "проблему" и является одним из признаков более правильного языка

Есть языки, в которых эта проблема технически не может возникнуть, например, BrainFuck, Befunge (и другие *funge), Malbolge, Whitespace и другие. Они самые правильные?
Фантом писал(а):
19.08.2010 15:58
Не спорю, но я писал несколько о другом: для того, кто считает C хорошим языком, а C++ - плохим, аргумент frp верен "с точностью до наоборот".

Вот с этого надо было начинать.
Спасибо сказали: