1 | |
Как избавиться от замусоривания cpp файлов дубликатами деклараций функций и переменных?17.11.2014, 08:52. Показов 1793. Ответов 28
Метки нет (Все метки)
Как избавиться от замусоривания cpp файлов дубликатами деклараций функций и переменных?
У меня есть например несколько файлов: opengl.h C++ #ifndef OPENGL_H #define OPENGL_H extern int a; extern void foo(); #endif // OPENGL_H C++ #include "opengl.h" int a; int main() { a = 5; return 0; } C++ #include "opengl.h" int a; void foo() { a = 9; }
0
|
17.11.2014, 08:52 | |
Ответы с готовыми решениями:
28
как избавиться от переменных в разделе данных Как избавиться в браузерной строке от get переменных Есть три файла. файл main.cpp и Source.cpp знают только Header.h, так как он подключен. как же подключается Source.cpp Как избавиться от глобальных переменных в многофайловом проекте на С++? |
Вездепух
11695 / 6374 / 1724
Регистрация: 18.10.2014
Сообщений: 16,066
|
|
17.11.2014, 09:08 | 2 |
Ну вообще-то должно быть два раза: объявление и определение. Для того, чтобы получить глобальную переменную (если она вам действительно нужна), в заголовочном файле должно быть написано 'extern int a;' (объявление), а в одном-единственном файле реализации - просто 'int a;' (определение). В какой именно файл вы поместите это определение - ваш выбор. Все.
А то, что у вас определение 'int a;' повторяется в нескольких файлах реализации - это грубая ошибка. В языке С++ такое запрещается. Поэтому ответ на ваш вопрос прост - просто выкосите нафиг лишние определения из файлов реализации и оставьте лишь одно объявление в заголовочном файле и одно определение в каком-то файле реализации. Ситуация полностью аналогична ситуации с 'foo'. Вы же не пихаете определение функции 'foo' в несколько файлов реализации? Вот и определение переменной тоже пихать не надо.
1
|
Вездепух
11695 / 6374 / 1724
Регистрация: 18.10.2014
Сообщений: 16,066
|
|
17.11.2014, 09:29 | 4 |
С чего бы это вдруг? Какая ошибка? Приведите пример.
Если это файлы одной программы, то нет, никакой ошибки не будет.
1
|
Вездепух
11695 / 6374 / 1724
Регистрация: 18.10.2014
Сообщений: 16,066
|
|
17.11.2014, 09:36 | 6 |
На колу мочало, начинай сначала... Я же ясно сказал - так делать нельзя ни в коем случае. 'int a;' должно присутствовать только в одном файле реализации. Все.
Хоть у вас 500 файлов, хоть миллион, во всей программе у вас будет открытым текстом написано ровно два 'int a;': один в заголовке как 'extern int a;' и еще один в одном из файлов реализации, как 'int a;'.
1
|
Вездепух
11695 / 6374 / 1724
Регистрация: 18.10.2014
Сообщений: 16,066
|
|
17.11.2014, 09:39 | 8 |
Вы, я вижу, не читатель, а писатель.
В любом случае, если у вас в программе 200 глобальных переменных вида 'int a' россыпью, то проблему надо править в несколько другой консерватории...
1
|
Вездепух
11695 / 6374 / 1724
Регистрация: 18.10.2014
Сообщений: 16,066
|
|
17.11.2014, 09:41 | 10 |
Вы несете чепуху. С чего бы это вдруг оно будет выдавать ошибку?
Наоборот, если вы начнете пихать 'int a' в каждый файл реализации, то получите от линкера ошибку множественного определения. (Некоторые реализации разрешают подобное, если определение не содержит инициализатора. Но это тем не менее не меняет того факта, что это ошибка.) Вчера вы что-то делали совсем не так, как описываете сейчас.
1
|
Вездепух
11695 / 6374 / 1724
Регистрация: 18.10.2014
Сообщений: 16,066
|
|
17.11.2014, 09:46 | 12 |
Именно для этого вы помещаете 'extern int a;' в заголовочный файл. Именно это делает переменную 'a' видимой во всех файлах (не забывайте только включать заголовочный файл везде, где надо). Больше ничего делать не надо.
1
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
|||||||||||
17.11.2014, 09:58 | 14 | ||||||||||
для глобальных переменных, я обычно создаю
файл Global.c
1
|
Вездепух
11695 / 6374 / 1724
Регистрация: 18.10.2014
Сообщений: 16,066
|
|
17.11.2014, 10:24 | 16 |
1
|
118 / 118 / 41
Регистрация: 14.12.2013
Сообщений: 352
|
|
17.11.2014, 10:34 | 17 |
TheCalligrapher,
Не по теме: нефига, ТС выбрал ValeryS )) хотя с согласен с твоим постом.
0
|
TheCalligrapher
|
17.11.2014, 10:38
#18
|
0
|
ValeryS
|
17.11.2014, 11:01
#19
|
0
|
17.11.2014, 11:09 | 20 |
0
|
17.11.2014, 11:09 | |
17.11.2014, 11:09 | |
Помогаю со студенческими работами здесь
20
Подключение файлов main.cpp some.cpp some.h Графический интерфейс НЕ GUI! как избавиться от глобальных переменных? Как избавиться от системных процедур и функций? Как перенести программу с С++ на С и избавиться от стандартных функций? Как писать проэкты из нескольких CPP файлов ? Как подключить библиотеку из двух файлов (.cpp и .h) к проекту Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |