LINUX.ORG.RU

Kak nuschno prawilno definirowat peremennie i inkludirowat?


0

0


Priwet!

Podskaschite poschaluista kak nado prawilno delat:
Imeetsja: main.cpp, main.h, x.cpp, x.h.

W x.h optisani prototipi funkzii x.cpp, taksche definirowani
peremennie dlja x.cpp (prawilno li eto?)

Funkzii iz x.cpp budut wiziwatsja w main.cpp,
po etomu includiruju x.h w main.cpp (#include "x.h")

Pri kompiljazii: cc -c main.cpp i cc -c x.cpp
sozdadutsja main.o i x.o,

// main.cpp
#include "main.h"
#include "x.h"

main ( )
{
i = func_from_xcpp ( );
}

////////////////////////

// main.h

int i;

////////////////////////


// x.cpp

#include "x.h"

int func_from_xcpp ( )
{
return 1;
}

////////////////////////

// x.h

int i; // ( ! )
int func_from_xcpp ( ); // Prototip

////////////////////////

dalee kompiliruju:
cc -c main.cpp
cc -c x.cpp

rabotaet. No pri linkowanii oschibka, schto
peremennaja 'i' usche definirowana i w main.o i w x.o
(kstati eto oschibka proishodit tolko togda, kogda
kompiliriju eto kak cpp a ne C)

Estestwenno ja delaju schto-to neprawilno, no kak nuschno prawilno delat?
Peresmotrel mnogo knig, no ob etom ne pischut. Kak, gde, w kakich
slutschajah nuschno definirowat prawilno peremennie?
Taksche esli bi bilo mnogo modulei, kotorie hotjat ispolzowat
obschie funkzii i peremennie - kak togda bit ?

Objasnite poschluista!
Zaranee spasibo.


Ну ты прогнал... неужели ни в одной книге?! :) Должен быть еще и здравый смысл. :) Почитай раздел "область видимости переменных". Про это написанно в любой книги по С. А про твои ошибки: 1) Переменные видимы только внутри блока, в крайнем случае обьявлять перемменые нужно непосредсвенно перед использование, но лучьше в начале блока. 2) Если нужны глобальные переменные и нужно чтобы они был видны из других файлов, обьявляй их как extern в файле где хочешь использовать что позволит компиллеру коректно ресолвить ссылки.

anonymous
()

Либо этот человек и не пытался делать cc -c main.cpp, либо он хидеры здесь неправильно привел, либо в main.cpp включен только один из этих хидеров.

timur
()

А на вопрос то я не ответил :). Я бы сделал так:
x.h
extern int func_from_x_cpp();

x.cpp
int func_from_x_cpp()
{
//
}

main.cpp
#inclde "x.h"
int i;
main()
{
i = func_from_x_cpp();
}


main.h - не нужен.Понятие модульности предполагает, что в одном модуле собирается только то, что необходимо для работы этого модуля. Поэтому int i надо объявлять в main.cpp. Ну и желательно в хидерах ничего не определять (ессссссно это не относится к inline функциям) - только объявления.

timur
()
Ответ на: комментарий от timur

Спасибо за помощь!

Значит ли это, что в .h файлах не декларируют переменные, а только
описывают прототипы функций, которые будут в .cpp?
Где правильно декларировать глоб. переменные для всех модулей?
Возможно ли обойти extern?

А вообще логично :)

Просто дело в чем, сама программа написана на C, все работало
(хотя я пишу еще не "чисто", вообщем сами видите :). Потом
оказалось, что мне необходимо использовать один класс, и естественно
я должен был все компилировать на C++...

К сожалению, я, как еще не профи, люблю очень глобальные переменные,
хотя, скажу в свое оправдание, уже понял, что это не хорошо.
Короче, у меня еще их достаточно (global.h). Этот файл я включил
везде (main.cpp, x.cpp) и так далее. И вот при компиляции
у меня возникали ошибки. extern везде писать - это ужас!
Впрочем теперь попробую так, как мне вы посоветовали.

Раньше я не использовал make, а теперь надо, и если бы я все
за раз компилировал, как раньше, то и этот вопрос бы я не задал,
но теперь делаю все с make (cc -c) и вот така лабуда.

Спасибо!

Igorek
() автор топика

Не знаю как насчет деклараций ( ну не знаю я что это такое :( ), а вот в терминах определение/объявление можно сказать, что в хидерах нужно объявлять ( просто сообщять компилятору, что есть такая партия ) переменные/функции/классы/члены классов, а определять ( собственно, выделять под них память, описывать код функций etc.. ) нужно в .cpp файлах. Еще раз повторю: кроме инлайн функций. Кстати в С, насколько я его знаю, такая же стратегия.

timur
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.