Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/55: Рейтинг темы: голосов - 55, средняя оценка - 4.60
 Аватар для bedvit
1210 / 261 / 22
Регистрация: 20.05.2016
Сообщений: 1,141
Записей в блоге: 22

Объявления функций До/После main(), файлы (*.cpp, *.h)

24.01.2018, 12:47. Показов 11902. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
В некоторых источниках пишут, что объявление функций после main() - признак хорошего тона. Хотя и нужно объявлять прототипы.
Хотел узнать Ваше мнение по этому вопросу.
Сам main() объявляю в конце кода из соображения экономии кода на прототипах.
Можно вынести функции и в отдельные файлы (*.cpp, *.h) - здесь тоже интересно Ваше мнение.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.01.2018, 12:47
Ответы с готовыми решениями:

Main.cpp: In function ‘int main()’: main.cpp:10:1: error: ‘then’ was not declared in this scope
Написал программу и выдает ошибку. #include <iostream> #include <math.h> using namespace std; int main() {double a, b, x; ...

Разбить main.cpp на файлы
Есть вот такой main.cpp: #include <stdlib.h> #include <iostream> #include <string.h> //#include <stdint.h> //#include...

Main.cpp In file included from main.cpp
//class.cpp #include "class.h" Ticket::Ticket() { prise = 0; marshrut = "none"; time = "none"; ...

22
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
24.01.2018, 13:05
bedvit, лично мне нравится когда в функции объявляются в *.h (близкие по смыслу), а определяются уже в отдельных *.cpp . Причем если функция огромная, что не есть хорошо, то ее желательно в отдельном *.cpp определить.
0
13 / 15 / 5
Регистрация: 16.10.2016
Сообщений: 206
24.01.2018, 13:07
Это может действовать до поры до времени. Лучше использовать прототипы тогда все функции будут известны сразу. А так если вам вдруг понадобится сделать так:
C++
1
2
3
4
5
6
7
8
9
void printChar(char ch)
{
    printInt(ch);
}
 
void printInt(int i)
{
    printChar(i);
}
(Код бессмысленный, просто для примера), то уже не получится.
А еще имея прототипы, можно легко посмотреть как использовать какую-либо функцию не заглядывая дальше в файл.

Цитата Сообщение от _stanislav Посмотреть сообщение
лично мне нравится когда в функции объявляются в *.h (близкие по смыслу), а определяются уже в отдельных *.cpp
Так тоже очень удобно для больших проектов, а для маленьких проще использовать прототипы, чем создавать еще файлы
1
techpriest
 Аватар для Mirmik
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
24.01.2018, 13:23
Преимущество объявление main в начале файла - точка входа в программу сразу бросается в глаза.
Больше преимуществ нету.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.01.2018, 13:32
Цитата Сообщение от bedvit Посмотреть сообщение
Хотел узнать Ваше мнение по этому вопросу.
если это студенческий хэлло-ворлд,
можно забить и не париться.

серьёзные вещи делают по принципу:
Цитата Сообщение от bedvit Посмотреть сообщение
функции и в отдельные файлы (*.cpp, *.h)
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
24.01.2018, 13:46
Цитата Сообщение от bedvit Посмотреть сообщение
что объявление функции
А вы тут ничего не путаете? Имхо, объявление = прототип. Типа
C++
1
int f(int a, char *s);
А вот это уже называется реализация
int f(int n, char *sss)
{
....
}

Добавлено через 11 минут
По поводу размещения реализаций я не знаю никаких законов. А о прототипах (объявлениях) можно сказать только, что они должны быть видны в точке вызова.
Правда, реализация функции по совместительству является и ее прототипом. Но чтобы не было путаницы, я бы разделил прототип и реализацию.
1
 Аватар для bedvit
1210 / 261 / 22
Регистрация: 20.05.2016
Сообщений: 1,141
Записей в блоге: 22
24.01.2018, 13:52  [ТС]
Байт, да, имел ввиду реализацию функции. А прототипы собственно и нужны (имхо), для видимости в точке вызова (если реализация после main() ). Смысл их ставить ПОСЛЕ - не просматривается.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
24.01.2018, 14:01
Цитата Сообщение от Байт Посмотреть сообщение
Имхо, объявление = прототип.
По этому поводу TheCalligrapher объяснял здесь: Как работают прототипы функций
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.01.2018, 14:22
Цитата Сообщение от Croessmah Посмотреть сообщение
По этому поводу TheCalligrapher объяснял здесь: Как работают прототипы функций
так ведь не раскрыта тема)

мне вот не очевидно, как это так:
объявление функции есть,
а прототипа нету)
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
24.01.2018, 14:36
Цитата Сообщение от hoggy Посмотреть сообщение
объявление функции есть, а прототипа нету
Также как у класса функция-член есть, а метода нету.

Добавлено через 9 минут
Что касается C, то
A function prototype is a declaration of a function that declares the types of its parameters.
0
 Аватар для bedvit
1210 / 261 / 22
Регистрация: 20.05.2016
Сообщений: 1,141
Записей в блоге: 22
24.01.2018, 14:52  [ТС]
Цитата Сообщение от Starikov Посмотреть сообщение
(Код бессмысленный, просто для примера)
- бог миловал, но за пример спасибо - есть такой момент - отмечу.
Цитата Сообщение от Croessmah Посмотреть сообщение
Как работают прототипы функций
- прочитал, интересно, спасибо.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.01.2018, 15:03
Цитата Сообщение от Croessmah Посмотреть сообщение
Также как у класса функция-член есть, а метода нету.
нет, не так же.

смотрите:

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
И существует оно в С только потому, что в языке С объявление функции может являться прототипом, а может и не являться прототипом.

вот мне не понятно, как это?
объявление есть, а прототипом оно не является.

нужны примеры когда является.
и когда не является.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,819
24.01.2018, 17:21
Цитата Сообщение от hoggy Посмотреть сообщение
нужны примеры когда является.
и когда не является.
C++
1
2
3
void foo(); // not a prototype
 
void foo(void); // prototype
Используя foo() можно с успехом вызвать foo(void), но прототипом она не является.

Вот иллюстрация этого правила в gcc:
http://rextester.com/TEZG4079
2
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.01.2018, 17:44
Цитата Сообщение от DrOffset Посмотреть сообщение
void foo(); // not a prototype
что это?
и зачем оно вообще нужно?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
24.01.2018, 17:54
Цитата Сообщение от hoggy Посмотреть сообщение
что это?
Это объявление с пустым identifier-list, а не с пустым parameter-type-list.
Можно еще и не с пустым:
C
1
void foo(x, y);
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,819
24.01.2018, 18:13
Цитата Сообщение от hoggy Посмотреть сообщение
что это?
и зачем оно вообще нужно?
Это Си
В Си же нет перегрузки, там одного имени достаточно для осуществления связывания.

Не по теме:


Мое личное мнение, что подобные вещи в стандарте языка свидетельствуют о попытке узаконить все наслоившиеся правила в ходе стихийного развития языка.
Такие вещи всегда появляются там, где реализация идет впереди стандартизации.

2
 Аватар для bedvit
1210 / 261 / 22
Регистрация: 20.05.2016
Сообщений: 1,141
Записей в блоге: 22
24.01.2018, 19:06  [ТС]
Правильно ли я понимаю, что и в Си и в С++ нужен прототип функции до точки входа, если функция "реализована" ниже точки входа (main() )? Исключений нет?
Байт, на этом ресурсе про объявление функций до/после main(), что в контексте вашего сообщения - выражение, видимо, не верно, а верен термин "реализация", еще используют термин "определение" (к примеру на msdn.microsoft.com). Как, все же, правильно?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,819
24.01.2018, 19:21
Цитата Сообщение от bedvit Посмотреть сообщение
Как, все же, правильно?
Официальные термины - declaration и definition, устоявшимися переводами на русский которых являются объявление и определение соответственно.

Добавлено через 8 минут
Declaration - это то, что тут назвали "прототип".
А Definition - это то, что тут назвали "реализация". При этом по правилам языка С++ declaration также является definition, кроме определенно оговоренных случаев.
A declaration is a definition unless
(2.1) — it declares a function without specifying the function’s body (8.4),
(2.2) — it contains the extern specifier (7.1.1) or a linkage-specification26 (7.5) and neither an initializer nor a
function-body,
(2.3) — it declares a non-inline static data member in a class definition (9.2, 9.2.3),
(2.4) — it declares a static data member outside a class definition and the variable was defined within the class
with the constexpr specifier (this usage is deprecated; see D.1),
(2.5) — it is a class name declaration (9.1),
(2.6) — it is an opaque-enum-declaration (7.2),
(2.7) — it is a template-parameter (14.1),
(2.8) — it is a parameter-declaration (8.3.5) in a function declarator that is not the declarator of a functiondefinition,
(2.9) — it is a typedef declaration (7.1.3),
(2.10) — it is an alias-declaration (7.1.3),
(2.11) — it is a using-declaration (7.3.3),
(2.12) — it is a deduction-guide (14.9),
(2.13) — it is a static_assert-declaration (Clause 7),
(2.14) — it is an attribute-declaration (Clause 7),
(2.15) — it is an empty-declaration (Clause 7),
(2.16) — it is a using-directive (7.3.4),
(2.17) — it is an explicit instantiation declaration (14.7.2), or
(2.18) — it is an explicit specialization (14.7.3) whose declaration is not a definition.
В частности 2.1 четко говорит нам о том, что определение функции также является ее объявлением.
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
24.01.2018, 19:56
Цитата Сообщение от bedvit Посмотреть сообщение
Байт, на этом ресурсе про объявление функций до/после main(), что в контексте вашего сообщения - выражение, видимо, не верно, а верен термин "реализация", еще используют термин "определение" (к примеру на msdn.microsoft.com). Как, все же, правильно?
Вы знаете, спорить о терминах - себя не щадить. Я вижу их так. Кто-то видит их иначе. Главное, чтобы мы говорили об одном и том же. А как там общепринято...

Не по теме:

Народ до сих пор бьется, что ж такое - натуральные числа. Остроголовые говорят, что они без нуля. Тупоголовые причисляют к ним ноль. Но пока это не очень мешает развитию теории чисел.



Добавлено через 2 минуты

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
член есть, а метода нету.
Вот это самая страшная ситуация, которая может случится с классом! Пусть наши классы минует чаша сия...:D:D

0
 Аватар для bedvit
1210 / 261 / 22
Регистрация: 20.05.2016
Сообщений: 1,141
Записей в блоге: 22
24.01.2018, 20:12  [ТС]
Байт, не спора ради, а токма понимания для. Что бы понимать друг друга. Ибо тема элементарная на первый взгляд, но есть чему поучиться мне (многому мне ещё учиться).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.01.2018, 20:12
Помогаю со студенческими работами здесь

Есть три файла. файл main.cpp и Source.cpp знают только Header.h, так как он подключен. как же подключается Source.cpp
main.cpp #include <iostream> #include"Header.h" using namespace std; int main() { A ob; ob.f(); return...

Как передать переменные и массивы из main.cpp в mainwindow.cpp?
Как передать переменные и массивы из main.cpp в mainwindow.cpp? main.cpp #include "mainwindow.h" #include <QApplication> ...

Включение библиотек в main.cpp и my_func.cpp
Здравствуйте, Подскажите пожалуйста, ни как не могу понять, вот если: //main.cpp #include <iostream> int main() ...

Подключение файлов main.cpp some.cpp some.h
Всем привет, программа разделенна на три файла poly.cpp main.cpp poly.h Кто мог бы объяснить как происходит подключение этих файлов, и как...

Вот: source_file.cpp: In function 'int main()': source_file.cpp:10:12: error: 'strlen' was not declared in this scope
#include<iostream> using namespace std; int main() { char a,b; int i,j; cout<<"Напишите слово:"; cin>>a; i=0; ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru