С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/345: Рейтинг темы: голосов - 345, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 15.04.2009
Сообщений: 5
1

Объявление глобальных переменных для всего проекта

15.04.2009, 12:54. Показов 71513. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите как объявить переменные, так чтобы они были глобальными для всего проекта, т.е. для всех модулей: Unit1, Unit2 и т.д.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.04.2009, 12:54
Ответы с готовыми решениями:

Объявление глобального указателя всего проекта
Здравствуйте! Программа состоит из нескольких модулей. В одном из модулей написан класс, объект...

Объявление глобальных переменных
#include "stdafx.h" #include <conio.h> #include <stdio.h> void main (int x, int y) {...

Объявление глобальных переменных в проекте Dev C++
Доброй ночи всем! Подскажите, пожалуйста, как правильно объявить глобальные переменные в проекте....

Объявление глобальных в контексте приложения переменных
Создаю проект в vc++ 2010. Прога содержит множество форм, в которых производятся манипуляции с БД...

7
Технофашист
228 / 216 / 11
Регистрация: 11.03.2009
Сообщений: 887
15.04.2009, 13:25 2
Можно просто подлючить пустой файл file.cpp, где и прописать переменные.
А потом этот файл везде, где нужны эти переменные глобальные, подключать через #include
0
562 / 373 / 55
Регистрация: 05.04.2009
Сообщений: 767
15.04.2009, 14:54 3
Что такое Unit1 и Unit2?
Это для программиста два файла,
а для компилятора один
(если вы конечно не забыли их связать #include-ом).

Что такое глобальные?
Это переменные вне функций!

Что такое
C++
1
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}
?
Это функция в функции.


Дальше ясно?
2
591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386
15.04.2009, 14:57 4
Лучший ответ Сообщение было отмечено как решение

Решение

Можно делать так. В одном файле пишем:
C++
1
int i, a, b;
А в другом пишем:
C++
1
extern int i, a, b;
А линковщик заменит на одну порцию переменных.
5
0 / 0 / 0
Регистрация: 15.04.2009
Сообщений: 5
16.04.2009, 03:13  [ТС] 5
Отличный вариант! воспользовался им, помогло.
в другой раз попробую вариант darkAngel: "Можно просто подлючить пустой файл file.cpp, где и прописать переменные.
А потом этот файл везде, где нужны эти переменные глобальные, подключать через #include"
0
Evg
Эксперт CАвтор FAQ
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
18.04.2009, 11:56 6
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Pavliga Посмотреть сообщение
в другой раз попробую вариант darkAngel: "Можно просто подлючить пустой файл file.cpp, где и прописать переменные.
А потом этот файл везде, где нужны эти переменные глобальные, подключать через #include"
Он тебе подсказал неправильный вариант. Директива #include означает непосредственную подстановку текста файла. Т.е. если рассмотреть то, что предложил darkAngel на коротком примере

Файл t.h:
C++
1
int a, b;
Файл t1.cc:
C++
1
2
3
4
5
#include "t.h"
void func1 (void)
{
  a = b;
}
Файл t2.cc:
C++
1
2
3
4
5
#include "t.h"
void func2 (void)
{
  b = a;
}
С виду вроде бы как хорошо. НО хорошо только для того, кто не чётко понимает, что тут делается. На компиляцию ты подаёшь два файла t1.cc и t2.cc. Какждый файл проходит стадию прероцессиро.вания, на которой раскрываются все макросы и делаются подстановки #include'ов. В результате на фактическую компиляцию попадут два файла со следующим сожержанием (комменариев там, понятное дело, не будет):

Файл t1.cc:
C++
1
2
3
4
5
6
7
/* Этот код образовался в результате подстановки файла t.h */
int a, b;
 
void func1 (void)
{
  a = b;
}
Файл t2.cc:
C++
1
2
3
4
5
6
7
/* Этот код образовался в результате подстановки файла t.h */
int a, b;
 
void func2 (void)
{
  b = a;
}
В результате чего ты получишь по два определения переменных a и b. На самом деле вот именно этот код в результате слинкуется нормально и будет работать правильно, потому как a и b - неинициализированные глобалы и линкуются по правилам COMMON'ов - т.е. линкер будет "сшивать" два эти определения в одно. Однако если ты изменишь файл t.h и сделаешь инициализацию

C++
1
int a = 1, b = 2;
то это уже будут инициализированные глобалы, которые линкуются по общим правилам и у тебя будет ошибка линковки

RazorQ тебе предложил правильный метод. В каком-либо файле *.cc (только в одном) пишутся определения (definition) переменных и в одном *.h файле, который будет цепляться во всех *.cc файлах сделать описание (declaration) переменных - при помощи ключевого слова 'extern'. Это именно тот момент, который многим начинающим не нравится - фактически всё, что должно использоваться где-либо за пределами данного файла, надо описывать два раза: один раз в файле *.cc, другой раз в файле *.h. Для языка программирования низкого уровня, к сожалению, невозможно сделать по другому. Да и не страшно это, т.к. если в файле *.cc ты поменял тип переменной (например, вместо int сделал float), то компилятор тебя всё равно схватит за руку (естественно, если ты правильно и везде подключил файд *.h), потомучто в одном файле он увидит описание переменной с одним типом, а определение с другим. С этой точки зрения можно не бояться того, что ты изменишь в одном месте и забудешь изменить в другом. С оговркой, что у тебя правильно подключены *.h файлы
16
0 / 0 / 0
Регистрация: 16.04.2020
Сообщений: 13
28.04.2020, 20:02 7
Можно так делать для структур?
Например:
struct factory
{
int a;
double b;
}
А в другом файле: extern fact a?
0
1702 / 898 / 207
Регистрация: 25.11.2009
Сообщений: 1,847
28.04.2020, 23:50 8
Цитата Сообщение от asonby2 Посмотреть сообщение
А в другом файле: extern fact a?
Что такое fact?
В другом файле можно написать
C++
1
extern factory a;
Но где-то этот экземпляр структуры должен быть объявлен (без extern).
0
28.04.2020, 23:50
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.04.2020, 23:50
Помогаю со студенческими работами здесь

Место для инициализации глобальных переменных
Помогите, делаю калькулятор. Столкнулся с проблемой: Где в c++ или в этом коде инициировать...

Динамическое выделение памяти для глобальных переменных
задача стоит такая: с датчика потоком идет информация, её необходимо сохранять в ОЗУ (в глобальную...

Кто распределяет память для статических и глобальных переменных?
Кто распределяет память для статических и глобальных переменных?

Создание глобальных переменных для доступа из всех форм
Всем доброго времени суток! Только только начал изучать Visual C++. Задача такая: есть несколько...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Блоги программистов
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
Полезные поделки на Arduino, которые можно сделать самому
raxper 06.01.2025
Arduino как платформа для творчества Arduino представляет собой удивительную платформу для технического творчества, которая открывает безграничные возможности для создания уникальных проектов. Эта. . .
Подборка решений задач на Python
IT_Exp 06.01.2025
Целью данной подборки является предоставление возможности ознакомиться с различными задачами и их решениями на Python, что может быть полезно как для начинающих, так и для опытных программистов. . . .
С чего начать программировать микроконтроллер­­ы
raxper 06.01.2025
Введение в мир микроконтроллеров Микроконтроллеры стали неотъемлемой частью современного мира, окружая нас повсюду: от простых бытовых приборов до сложных промышленных систем. Эти маленькие. . .
Из чего собрать игровой компьютер
inter-admin 06.01.2025
Сборка игрового компьютера требует особого внимания к выбору комплектующих и их совместимости. Правильно собранный игровой ПК не только обеспечивает комфортный геймплей в современных играх, но и. . .
Обновление сайта www.historian.b­y
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
Модель полного двоичного сумматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list): s=^y] p=x and y for i in range(1,len(x)): s. append((x^y)^p) p=(x and y)or(p and (x or y)) return s x=list() y=list()
Это мы не проходили, это нам не задавали...(аси­­­­­­­­­­­­­­хро­н­н­ы­й счётчик с управляющим сигналом задержки).
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
Руководство по созданию бота для Телеграм на Python
IT_Exp 04.01.2025
Боты для Телеграм представляют собой автоматизированные программы, которые выполняют различные задачи, взаимодействуя с пользователями через интерфейс мессенджера. В данной статье мы рассмотрим,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru