C: Function pointer forward declaration

38 отговора 0 прегледа
#1

C: Function pointer forward declaration

Имам следната постановка:

В началото на .c файла имам статична таблица от типа Id : FunPtr.
Под нея са дефинирани самите функции, които са статични и няма предвиден за тях хедър.
typedef-ът на самия пойнтер е в някакъв хедър който се вижда.

Някой да се сеща културен начин (т.е. изключваме груби кастове и т.н.) да декларирам тия функции така че да се виждат при инициализацията на таблицата без да им пиша пълните прототипи? Т.е. искам да ползва тайпдефа по някакъв начин, че е по-малък на обем.

System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор
в отговор на Colombino #2

Re: C: Function pointer forward declaration

Най-културното, което се сещам е да напишеш макрос, който да генерира пълния прототип.

Ако държиш на енигматичността, може да го използваш в хедъра за да дефинираш типа на указателя.

Отговор
в отговор на Colombino #3

Re: C: Function pointer forward declaration

Тайпдефа няма как да ти помогне. С него най-много някой поинтер да дефинираш ама пак стигаме до проблема с инициализацията.

Не виждам какъв ти е проблема да декларираш функциите преди инициализацията.

Пък чак толкова ако те мързи ами инициализарай таблицата на края на файла.

Отговор
в отговор на Robbie Rotten #4

Re: C: Function pointer forward declaration

Бе до тоя извод и аз стигнах, просто се надявах да излезне некой с по-яки знания по C и да каже как се прави.
Проблемът ми е, че функциите имат космати прототипи на по 4 реда да кажем, аз предпочитам да са макс на 1. Ма тва не е съществено, де, просто като аз не знам нещо как да стане винаги се радвам ако намера неой дето знае как, ама по друг начин.

System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор
в отговор на vmwr #5

Re: C: Function pointer forward declaration

Подкрепям за макроса. Освен това има номер с един макрос да дефинираш два салама, ама е висша акробатика и не е за всеки.

Отговор
в отговор на Colombino #6

Re: C: Function pointer forward declaration

Да не си се върнал да работиш в Джонсън ?


майтапя се

Отговор
в отговор на Colombino #7

:-D

Не знам дали ще ти хареса
Значи преди таблицата заделяш един статичен масив от поинтери към функциите
На таблицата й задаваш съответния елемент от масива,
а след декларацията на всяка функция - добавяш функцията в масива

Dum loquo hora fugit
Отговор
в отговор на Colombino #8

Re: C: Function pointer forward declaration

Ако таблицата е публична ги викай направо през нея бре младеж. Добър начин за всяване на смут, объркване, и респект сред останалите младежи в дружинката. ;)

0xCodeFace
Отговор
в отговор на Wolfheart #9

Re: C: Function pointer forward declaration

Неее, пази Боже! На C++ пиша повечето време, ма се налага понякога да се барат и модули на C. А тва хич не ме кефи. Език без конструктор/деструктор, които се викат когато трябва, а не когато реши някой колектор не го признавам. Всъщност аз друг език освен C++ който има такова нещо не знам (не казвам, че няма, просто не знам). Толкова елементарно нещо, толкова важно и толкова липсващо.

System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор
в отговор на Colombino #10

Re: C: Function pointer forward declaration

е разни яви мисля че викат деструктора веднага, а паметта освобождават когато им кефне. впрочем не знам какво се кефят толкова на гарбидж колекторите, смарт поинтера върши същото, но е десет пъти по-предвидим.




NE SUTOR ULTRA CREPIDAM
Отговор
в отговор на zaphod #11

Re: C: Function pointer forward declaration

И ти като всички като чуеш 'деструктор' и се сещаш за памет. Паметта е просто частен случай на ресурс. Идеята за симетрични действия във фиксиран интервал е много по-обща (и смарт пойнтерите са нейното проявление).
Конкретно джавата не знам да има деструктори, но C# има. Но за да се викнат когато трябва трябва да използваш доста неудобна езикова конструкция 'using' (дори не я знам как се ползва, но вече знам че я има). По стандартен начин преди да го знам това бях се сблъсквал с отворен от мен файл, който не се е затворил когато съм очаквал (при излизане от блока да му се викне деструктора да го затвори).

System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор
в отговор на Colombino #12

Re: C: Function pointer forward declaration

начи лошо. деструктора наистина е важно да се вика когато обекта спре да го има, пък паметта да се освобождава когато иска.




NE SUTOR ULTRA CREPIDAM
Отговор
в отговор на Colombino #13

Re: C: Function pointer forward declaration

Мдам, C++ програмистите сме свикнали при излизане от блока да се оправят нещата. Но в другите ООП езици животът е доста по-сложен :) Въпреки че ако в деструкторите цъфне ексепшън, пак може да се омаже работата.

Чудя се тоя клас няма ли си метод от сорта на CloseFile(). Ще ми побелеят косите, ако се налага за всеки файл да чакам гарбич кълектора да го затваря :D Дори и да го викаш някъде този метод, викането му може да бъде възпрепятствано от цъфване на някой ексепшън и трябва да се подхожда по по-специален начин.

Явно затова чистите Си програмисти мразят ексепшъните :)

Редактирано от Wolfheart на

Отговор
в отговор на Wolfheart #14

Re: C: Function pointer forward declaration

аз съм С++ и пак ги мразя. тоест мразя функционалното им използване - да пишеш код който разчита на тях, както някои обичат.




NE SUTOR ULTRA CREPIDAM
Отговор
в отговор на Wolfheart #15

Re: C: Function pointer forward declaration

Има си close, ма хич не ги обичам тия работи. В края на краищата така го направих. По-късно ми казаха за 'using'. Големият проблем на ръчното викане на деструктващата функция е следният:

tryА
{
конструкт 1;
конструкт 2; -> изцепшън
}
catch
{
проверяваме конструкт 2 за null и ако не е викаме деструкт 2.
проверяваме конструкт 1 за null и ако не е викаме деструкт 1.
}

деструкт 2
деструкт 1

Е тва е фирата - дублиране на кода за деструкт и постоянни проверки кое е успяло да се констуктне и кое - не.

System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор
в отговор на Wolfheart #16

Re: C: Function pointer forward declaration

Тия дето хвърлят ексепшъни в деструктор ще са първите изправени до стената като дойде революцията.

Отговор
в отговор на Colombino #17

Re: C: Function pointer forward declaration

Ахъ, пробвай да направиш using на C# клас дето не имплементира IDisposable и пиши тука как се е засмял компилатора. Десктруктори естествено си има, ма немат общо с using.

Java има finalize.

Отговор
в отговор на _gruhal_ #18

Re: C: Function pointer forward declaration

Немам намерение да навлизам в тънкостите на #. Говоря, че класа за файл може да се ползва с using, щото е именно такъв и има деструктор.
Общото е, че деструкторът се вика навреме като се ползва using, а не когато се сети боклукчията.

System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор
в отговор на Colombino #19

Re: C: Function pointer forward declaration

Ми не навлизай, ма това което ти казвам е, че десктруктор в C# и имплементиране на IDisposable, което е нужно за using, са 2 абсолютно различни неща и using НЕ ВИКА десктруктора.

Отговор
в отговор на _gruhal_ #20

Re: C: Function pointer forward declaration

Ми доколкото си спомням в C# имаше два вида 'деструктори' и едното явно е тва което носи името 'дестуктор', а другото си има друго име. Не ме интересува конкретиката на езика и се надявам никога пак да не ми се наложи да пиша на него. Важното, че за да ми се извика дадена функция, както и да се нарича тя, при излизане от скоуп се ползва 'using'.

System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор