обьясните чайнику
От: Denton  
Дата: 18.08.03 17:09
Оценка:
как создавать модули а имено *.h и *.c *.cpp файлы. В *.h я обявляю прототипы функций а в *.c их тело и когда пишу в main.c #include <*.h> оно его не находит хотя файлы находятся в одной директории ето я лечю так #include <D:\...\...\*h> после этого при build'e выдает много ошибок. Обьясните пожалуста как надоделать.
Re: обьясните чайнику
От: Анатолий Широков СССР  
Дата: 18.08.03 17:50
Оценка: +1
Здравствуйте, Denton, Вы писали:

D>как создавать модули а имено *.h и *.c *.cpp файлы. В *.h я обявляю прототипы функций а в *.c их тело и когда пишу в main.c #include <*.h> оно его не находит хотя файлы находятся в одной директории ето я лечю так #include <D:\...\...\*h> после этого при build'e выдает много ошибок. Обьясните пожалуста как надоделать.


Правила простые:

<...> — означает стандартные заголовочные файлы (они могут и не существовать в виде файлов)
"..." — заголовочные файлы проекта или твоих собственных библиотек.

То есть, не


#include <myheader.h>


а

#include "myheader.h"
Re[2]: обьясните чайнику
От: Denton  
Дата: 18.08.03 21:15
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>Правила простые:


АШ><...>> — означает стандартные заголовочные файлы (они могут и не существовать в виде файлов)

АШ>"..." — заголовочные файлы проекта или твоих собственных библиотек.
АШ>То есть, не
АШ>
АШ>#include <myheader.h>
АШ>

АШ>а
АШ>
АШ>#include "myheader.h"
АШ>


теперь все компилируеся но при build'e выдоет ошибки :
winsys.obj : error LNK2005: "int height" (?height@@3HA) already defined in main.obj
winsys.obj : error LNK2005: "int width" (?width@@3HA) already defined in main.obj
winsys.obj : error LNK2005: "bool fullscreen" (?fullscreen@@3_NA) already defined in main.obj
winsys.obj : error LNK2005: "bool ShowFPS" (?ShowFPS@@3_NA) already defined in main.obj
winsys.obj : error LNK2005: "struct HWND__ * h_Wnd" (?h_Wnd@@3PAUHWND__@@A) already defined in main.obj
winsys.obj : error LNK2005: "struct HDC__ * h_DC" (?h_DC@@3PAUHDC__@@A) already defined in main.obj
Re[3]: обьясните чайнику
От: Андрей Тарасевич Беларусь  
Дата: 18.08.03 23:27
Оценка:
Здравствуйте, Denton, Вы писали:

D>Здравствуйте, Анатолий Широков, Вы писали:


АШ>>Правила простые:


АШ>><...>> — означает стандартные заголовочные файлы (они могут и не существовать в виде файлов)

АШ>>"..." — заголовочные файлы проекта или твоих собственных библиотек.
АШ>>То есть, не
АШ>>
АШ>>#include <myheader.h>
АШ>>

АШ>>а
АШ>>
АШ>>#include "myheader.h"
АШ>>


D>теперь все компилируеся но при build'e выдоет ошибки :

D>winsys.obj : error LNK2005: "int height" (?height@@3HA) already defined in main.obj
D>winsys.obj : error LNK2005: "int width" (?width@@3HA) already defined in main.obj
D>winsys.obj : error LNK2005: "bool fullscreen" (?fullscreen@@3_NA) already defined in main.obj
D>winsys.obj : error LNK2005: "bool ShowFPS" (?ShowFPS@@3_NA) already defined in main.obj
D>winsys.obj : error LNK2005: "struct HWND__ * h_Wnd" (?h_Wnd@@3PAUHWND__@@A) already defined in main.obj
D>winsys.obj : error LNK2005: "struct HDC__ * h_DC" (?h_DC@@3PAUHDC__@@A) already defined in main.obj

Эта тем уже измочалена вдоль и поперек. Еще раз

Нельзя помещать определения объектов и неинлайновых функций в заголовочные файлы

В заголовочные файлы обычно помещают объявления, но не определения. Сделай поиск по форуму на тему объявлений, определений и заголовочных файлов. Или поищи просто 'LNK2005'.
Best regards,
Андрей Тарасевич
Re[3]: обьясните чайнику
От: sercher Украина  
Дата: 19.08.03 05:56
Оценка:
В заголовочных файлах нельзя (т.е. не рекомендуется) объявлять переменные и реализацию функций. И настойчиво рекомендуется обрамлять их макросами #ifndef :



 // main.h - header file bla-bla-bla..
 //
 //
 #ifndef _MAIN_H_
 #define _MAIN_H_

 // тело файла


 #endif
Re[4]: обьясните чайнику
От: Vano Россия  
Дата: 19.08.03 12:43
Оценка:
Здравствуйте, sercher, Вы писали:


S> В заголовочных файлах нельзя (т.е. не рекомендуется) объявлять переменные и реализацию функций. И настойчиво рекомендуется обрамлять их макросами #ifndef :




S>
S> // main.h - header file bla-bla-bla..
S> //
S> //
S> #ifndef _MAIN_H_
S> #define _MAIN_H_

S> // тело файла


S> #endif
S>


А можно в начале файла main.h написать5:
#pragma once
Думай, прежде чем родиться в этой сказочной стране!
(с) Антон Духовской
Re[5]: обьясните чайнику
От: Stepkh  
Дата: 19.08.03 13:16
Оценка:
Здравствуйте, Vano, Вы писали:

V>Здравствуйте, sercher, Вы писали:



S>> В заголовочных файлах нельзя (т.е. не рекомендуется) объявлять переменные и реализацию функций. И настойчиво рекомендуется обрамлять их макросами #ifndef :



V>А можно в начале файла main.h написать5:

V>#pragma once

для какого компилятора?
Re[6]: обьясните чайнику
От: Vano Россия  
Дата: 19.08.03 14:14
Оценка:
V>>А можно в начале файла main.h написать5:
V>>#pragma once

S>для какого компилятора?


Точно — для VS, у которых _MSC_VER>1000. Для других — давненько не работал, не знаю...
Думай, прежде чем родиться в этой сказочной стране!
(с) Антон Духовской
Re[4]: обьясните чайнику
От: cencio Украина http://ua-coder.blogspot.com
Дата: 19.08.03 14:25
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:


АТ>Эта тем уже измочалена вдоль и поперек. Еще раз


АТ>Нельзя помещать определения объектов и неинлайновых функций в заголовочные файлы

но если очень хочется и используеш Visual C++
то можно, главное не забыть добавить __declspec(selectany) (это из разряда Microsoft Specific bad practice)

АТ>В заголовочные файлы обычно помещают объявления, но не определения. Сделай поиск по форуму на тему объявлений, определений и заголовочных файлов. Или поищи просто 'LNK2005'.

а еше лучше не читать форумы и MSDN, а по хорошей книжке разобраться чем "обьявление" отличается от "определения"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.