реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> классы памяти, как умело применить
Zelepuk
сообщение Aug 27 2011, 12:02
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Здравствуйте!
Мне необходимо, чтобы переменная объявленная в файле my.c была видна так же в файле main.c

я делаю так

в my.c пишу:

int x;

в main.c пишу:

extern int x;

Это верное понимание спецификатора extern ?

Очень нужно убедиться.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Aug 27 2011, 12:10
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Да, верно
Go to the top of the page
 
+Quote Post
777777
сообщение Aug 30 2011, 09:26
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(Zelepuk @ Aug 27 2011, 16:02) *
в main.c пишу:

extern int x;

Это верное понимание спецификатора extern ?

В принципе да, но более универсальный подход - помещать extern в .h файл и включать во все файлы проекта.
Go to the top of the page
 
+Quote Post
Lexy_one
сообщение Aug 30 2011, 13:11
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 28-07-09
Из: Чернигов
Пользователь №: 51 621



Цитата(777777 @ Aug 30 2011, 12:26) *
В принципе да, но более универсальный подход - помещать extern в .h файл и включать во все файлы проекта.


В принципе да так более универсально... Но не для всех случаев... Например включив переменную в .h файл можно случайно изменить ее где не нужно, а не включив ее - таких ошибок можно избежать.
А вобще, с моей точки зрения лучше проанализировать - нужен ли доступ к данной перемменной в других файлах проекта. Если нужно, то я обращаюсь к ней через спец процедуры (типа: Read(Х) или Write(Х)).
А переменные со спецификатором extern пытаюсь по возможности не использовать.
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Aug 30 2011, 14:24
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Цитата(777777 @ Aug 30 2011, 13:26) *
В принципе да, но более универсальный подход - помещать extern в .h файл и включать во все файлы проекта.


если я вас правильно понял то нужно сделать так

в .h файле:

extern int x;

в других файлах :

extern int x;

Это правильно?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Aug 30 2011, 14:35
Сообщение #6


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Zelepuk @ Aug 30 2011, 18:24) *
в других файлах :

#include xxx.h

Естественно, в .h-файле не забыть обертку-предохранитель
#ifndef NAME_H
#define NAME_H

... нужный текст

#endif


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
777777
сообщение Aug 30 2011, 15:03
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(Zelepuk @ Aug 30 2011, 18:24) *
если я вас правильно понял то нужно сделать так

в .h файле:

extern int x;

в других файлах :

extern int x;

Это правильно?


Нет. В .h файле:

extern int x;

в одном из c-файлов:

int x;



Цитата(MrYuran @ Aug 30 2011, 18:35) *
Естественно, в .h-файле не забыть обертку-предохранитель

Это еще зачем? Такое бывает нужно в переполненных библиотеках, превратившихся за годы в спагетти. В твоем собственном проекте я думаю ты сам сможешь включать .h файл ровно по одному разу в каждый .c-файл.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Aug 30 2011, 15:19
Сообщение #8


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(777777 @ Aug 30 2011, 19:03) *
Это еще зачем? Такое бывает нужно в переполненных библиотеках, превратившихся за годы в спагетти. В твоем собственном проекте я думаю ты сам сможешь включать .h файл ровно по одному разу в каждый .c-файл.

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


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
777777
сообщение Sep 1 2011, 11:08
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(MrYuran @ Aug 30 2011, 19:19) *
Весь смысл как раз в том, чтобы включать хедер модуля во все файлы, где используются функции/переменные данного модуля.
И в общем случае он может включаться много раз.

Если h-файл включается в c-файлы, то много раз он не может включиться при всем желании. Такое возможно только если h-файл включен в другой h-файл. Но при правильном построении проекта это не требуется.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 1 2011, 11:52
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (777777 @ Sep 1 2011, 14:08) *
Такое возможно только если h-файл включен в другой h-файл. Но при правильном построении проекта это не требуется.
При правильном - как раз сплошь и рядом. Особенно в плюсах.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 00:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01425 секунд с 7
ELECTRONIX ©2004-2016