Тут размещают свои топики новички в С/С++.

Тема в разделе "LANGS.C", создана пользователем nitrotoluol, 4 мар 2007.

  1. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    не успел)
     
  2. Green_DiCk

    Green_DiCk New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2007
    Сообщения:
    338
    Блин, то что можно подключить хидер и все будет чики-пуки я в курсе. Просто у меня одна единственная ф-ция экспортируется и неохота из за нее одной городить лишний хидер. подключать сам файл ххх.c - это не кошерно. вот я и интересуюсь - не как мне сделать, а почему вышеприведенный вариант не катит. ведь по идее extern - указание линкеру поискать ф-цию в других модулях. и почему он ее не находит - я хз.
     
  3. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Так ему надо сказать где искать. Если модуль не знает о сущестсовании xxx.c, откуда компилеру знать где искать? extern здесь вообще ненужен. Делай хедер, делай инклуд и всё. Хедер для одной функции - это нормально. Сегодня там одна функция, завтра десять.
     
  4. Green_DiCk

    Green_DiCk New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2007
    Сообщения:
    338
    А нельзя разве тупо просканировать все объектники проекта? Ведь файл ххх.с находится у меня в проекте и при компиляции для него создается объектник. Разве этого не достаточно чтобы предположить что требуемая ф-ция может быть там?
    А в каких случаях тогда вообще extern нужен? Для ф-ций он не применяется вообще что ли?

    Ок. Раз никак по другому, сделаю хедер. Спасибо.
     
  5. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Ты путаешь линкер и компилятор. Если у тебя есть функция в твоём исходнике, который является частью проекта, то линкер тут не причём. То, что мы обсуждаем - это работа компилятора.

    Если тебе хочется, ты можешь скомплировать библиотеку xxx.lib (.a) из xxx.c, подключить её к проекту, а в main.cpp объявить внешнюю функцию из этой библиотеки через extern. Тогда линкер будет искать функции в подключенных библиотеках на этапе сборки и включит твою foo() в бинарник.
     
  6. Green_DiCk

    Green_DiCk New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2007
    Сообщения:
    338
    А почему бы не поступить так - компилятор компилирует файл main.сpp, встречает там foo() - и не может найти ее реализацию. но он видит что ф-ция снабжена директивой extern и как-нибудь ее помечает, что она находится в другом модуле. Потом линкер начинает сборку - находит модуль main.obj и видит в нем unresolved ф-цию foo(). Тогда он сканирует другие объектники и находит код этой ф-ции в файле xxx.obj, ну и прописывает соотвественно нужные адреса, склеивает это дело в экзешник.
    Какое вообще принципиальное различие между либами и объектниками?
     
  7. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    так ты же не указал, _в каком "модуле"_ у тебя эта ф-ция находится. где ее компилер искать то будет?
     
  8. Green_DiCk

    Green_DiCk New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2007
    Сообщения:
    338
    Да е мае.. компилер ниче искать не будет. он будет переводить инструкции си в команды процессора. искать будет линкер. и только когда он, просканировав все объектники проекта не найдет реализацию ф-ции foo(), тогда пусть матерится на unresolved symbol.
     
  9. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    А как компилятор узнает прототип функции? Ее параметры? Во многих ситуациях ему нужно будет осуществлять приведение типов. Как он сможет узнать какая это функция вообще? (stdcall, fastcall, cdecl). От всех этих вещей зависит код, который должен сгенерировать компилятор. Для этого и нужен прототип в хидере.
     
  10. Nero_n

    Nero_n New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2008
    Сообщения:
    33
    не знаю как везде, но в Студии достаточно объявить прототип - линкер сам найдет все объектники, используемые в Solution. только для случаев, когда работа идет с несколькими проектами, бывает нужно указать порядок сборки.

    Green_DiCk
    нужно было объявить foo не как extern, a как extern "C". или можно вообще убрать слово "extern" (оно теперь по-умолчанию используется) и сменить расширение xxx с ".c" на ".cpp".
    Код (Text):
    1. // main.cpp
    2. //...
    3. extern "C" int foo(...); // прототип ф-ции, реализованной в файле xxx.c
    4. //...
    5. int main()
    6. {//...
    7.  foo(...);
    8. //...}
     
  11. Green_DiCk

    Green_DiCk New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2007
    Сообщения:
    338
    Forever
    Аррргххх!! Прототип, предваренный директивой extern был у меня в файле main.cpp!

    Nero_n
    Спасибо большое. Расписал все от А до Б! Действительно все так и есть - и от расширения файла зависит и можно без extern обойтись одним прототипом если сменить расширение. Моя ошибка была в том что забил на различия в компиляции .c и .cpp файлов. Параметр "С" встречал в чужих исходниках, но не заморачивался на его смысл. Теперь все ясно.


    Всем спасибо за ответы.
     
  12. EvilCoder

    EvilCoder New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2006
    Сообщения:
    30
    Здравствуйте!
    Решил заняться кернел кодингом. С трудом нашел и скачал "Microsoft Platform SDK for Windows Server 2003 R2"
    Создаю проект. пишу include "ntddk.h" - а его вообще там нет. как так? Во всех пример по написанию драйверов используется этот заголовочный файл, как его может не быть в SDK? или он щас как то по новому называется? =)))
    спасибо большое за внимание...
     
  13. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Он в DDK, а не в SDK.
     
  14. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    EvilCoder
    PSDK это для написания аппликух, а не для кернел-вещей
     
  15. EvilCoder

    EvilCoder New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2006
    Сообщения:
    30
    тьфу $!#!@*(#&@)$^!@!#!@$!$#%!!!!!! это был мат...
    вот я в натуре ламер полный....
    спасибо большое...
    а где можно скачать DDK? с Майкрософта не получится ибо винда пиратская...
     
  16. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    Народ, нуждаюсь в вашей помощи.
    Проблема значит такая: решил я начать учить С++, скачал книгу (С++ для чайников), поставил Визуал С++. Хочу значит сделать прогу из примера книги. Создаю новый проект, создаю .срр файл. Пишу код который нужно, жму по дебаг - а мне пишет мол файл прожект1.ехе не найден. Никакие экзешники не создаются. Помогите пожалуйста разобраться, заранее спасибо.
     
  17. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    Loginanton
    ошибка какая?
    компилятор должен вернуть ошибку
     
  18. bigredcat

    bigredcat New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2007
    Сообщения:
    54
    Все экстрасенсы уехали на съемку "Битва экстрасенсов"
     
  19. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    Так ошибка в том что неможет найти экзешник (а его ведь и нет). Может я что то неправильно делаю?
     
  20. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    Loginanton
    ошибка в том, что ехе-щник не компилируется.
    Поэтому отладчик и не может его найти.

    Как вариант, не хватает места на диске либо ты задал несуществующий выходной путь.

    Код в студию + настройки проекта. В частности настройки компилятора и линкера.