Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
LighterV
4 / 4 / 0
Регистрация: 08.08.2013
Сообщений: 48
#1

Почему в файле все функции объявлены как static? - C++

22.07.2014, 11:46. Просмотров 905. Ответов 22
Метки нет (Все метки)

Привет!
В исходном коде Android я нашёл один файл нативного кода на C/C++. Все функции помечены как static и располагаются в одном файле, который больше 9000 строк кода.
Не понимаю, почему не разбить этот файл на несколько, чтобы удобнее было читать. Есть какое-нибудь обоснование этому? Может быть static функции выполняются быстрее или что-нибудь ещё?
https://android.googlesource.com/pla...tiveCrypto.cpp
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2014, 11:46     Почему в файле все функции объявлены как static?
Посмотрите здесь:
C++ Нужно ли функции с оператором глобального разрешения ставить сразу за классом,в котором объявлены?
C++ [C/C++]Не могу объявить static функцию в header файле.
C++ Почему пропускает все функции?!
Почему переменная объявленная static работает не корректно? C++
C++ определение функции в ЗАГОЛОВОЧНОМ файле. В основном предполагается переопределение ТЕЛА этой функции. Как это сделать, не правя хидер?
C++ Ключевое слово static в объявлении функции
C++ Массив в функции со static указателем на него
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
13057 / 7320 / 817
Регистрация: 27.09.2012
Сообщений: 18,066
Записей в блоге: 3
Завершенные тесты: 1
22.07.2014, 11:51     Почему в файле все функции объявлены как static? #2
Цитата Сообщение от LighterV Посмотреть сообщение
Есть какое-нибудь обоснование этому?
Например, все функции там взаимосвязанны.
Цитата Сообщение от LighterV Посмотреть сообщение
Не понимаю, почему не разбить этот файл на несколько, чтобы удобнее было читать.
и прыгать по всем файлам?
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
22.07.2014, 12:05     Почему в файле все функции объявлены как static? #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Функция, объявленная статической в файле не доступна в других модулях. Т.о., если этот файл просто разбить хотя бы на две части (ничего особо не меняя), то функции в одной части не смогут напрямую обращаться к функциям из другой части.
9к строк это на самом деле не так уж и много для одного файла.
Кстати объявление функций statiс для сокрытия их от других единиц трансляции является устаревшим подходом. В современном C++ правильнее использовать безымянные пространства имен.
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,013
22.07.2014, 12:28     Почему в файле все функции объявлены как static? #4
Цитата Сообщение от Tulosba Посмотреть сообщение
В современном C++ правильнее использовать безымянные пространства имен.
В 03 стандарте обозвали static устаревшим, потом одумались и из 11 это убрали.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
22.07.2014, 12:29     Почему в файле все функции объявлены как static? #5
Цитата Сообщение от 0x10 Посмотреть сообщение
В 03 стандарте обозвали static устаревшим, потом одумались и из 11 это убрали.
В связи с чем? Нашли что-то плохое в безымянном namespace?
LighterV
4 / 4 / 0
Регистрация: 08.08.2013
Сообщений: 48
22.07.2014, 13:00  [ТС]     Почему в файле все функции объявлены как static? #6
Цитата Сообщение от Croessmah Посмотреть сообщение
Например, все функции там взаимосвязанны.
На самом деле не все функции взаимосвязаны.

Цитата Сообщение от Croessmah Посмотреть сообщение
и прыгать по всем файлам?
А почему бы не разбить связанные функции по файлам? Неужели удобнее в 9000 строках искать?

Цитата Сообщение от Tulosba Посмотреть сообщение
Функция, объявленная статической в файле не доступна в других модулях. Т.о., если этот файл просто разбить хотя бы на две части (ничего особо не меняя), то функции в одной части не смогут напрямую обращаться к функциям из другой части.
Это понятно, но можно же убрать static и сделать заголовочные файлы и функции смогут общаться друг с другом.
Kastaneda
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,249
Записей в блоге: 1
Завершенные тесты: 1
22.07.2014, 13:02     Почему в файле все функции объявлены как static? #7
Цитата Сообщение от LighterV Посмотреть сообщение
но можно же убрать static и сделать заголовочные файлы и функции смогут общаться друг с другом.
Это уже принципиально другой подход. Если ф-ции скрывают в одном файле, значит это для чего-то понадобилось.
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,013
22.07.2014, 13:05     Почему в файле все функции объявлены как static? #8
Цитата Сообщение от Tulosba Посмотреть сообщение
В связи с чем? Нашли что-то плохое в безымянном namespace?
static == internal linkage, т.е. по идее символ не должен нигде фигурировать в объектнике.
Безымянный неймспейс == украшение имен. Т.е. просто разные механизмы.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
22.07.2014, 13:13     Почему в файле все функции объявлены как static? #9
Цитата Сообщение от 0x10 Посмотреть сообщение
static == internal linkage, т.е. по идее символ не должен нигде фигурировать в объектнике.
Вероятно сноска в C++11 как раз на этот счет (7.3.1.1/1):
Although entities in an unnamed namespace might have external linkage, they are effectively qualified by a name unique to their translation unit and therefore can never be seen from any other translation unit.
Т.е. несмотря на external linkage всё равно достучатся извне нельзя. Но при этом это не то же самое, что и static, который дает internal linkage.
Короче говоря, для пользователя кода, как я понял "те же яйца, вид сбоку". Поправьте, если не так.
HighPredator
5476 / 1842 / 343
Регистрация: 10.12.2010
Сообщений: 5,433
Записей в блоге: 3
22.07.2014, 13:25     Почему в файле все функции объявлены как static? #10
Я бы выразился чуть более точно: безымянный неймспейс в данном контексте -- более лучший механизм. Кстати, при разработке 11 стандарта депрекацию статика убрали, т.к. ни до кого не достучались почувствовали потенциальный баттхерт в совместимости с си.

Добавлено через 4 минуты
И, да, я не читал то, что выше.
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,013
22.07.2014, 13:32     Почему в файле все функции объявлены как static? #11
Tulosba, на практике получается, что реализованы плюс-минус одинаково.
HighPredator, static писать короче)
HighPredator
5476 / 1842 / 343
Регистрация: 10.12.2010
Сообщений: 5,433
Записей в блоге: 3
22.07.2014, 13:46     Почему в файле все функции объявлены как static? #12
Цитата Сообщение от 0x10 Посмотреть сообщение
static писать короче)
Совершенно верно. Но, имхо, в контексте плюсов и шаблонов это уже не особо актуально. Кстати о птичках: если мне не изменяет память, то типы/указатели/ссылки со внутренним связыванием не могут выступать в качестве параметров шаблонов. Так, что если сие было притащено из си, то ... уупс... правка исходника. В общем и тут черти-что и сбоку бантик
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
22.07.2014, 13:58     Почему в файле все функции объявлены как static? #13
Цитата Сообщение от HighPredator Посмотреть сообщение
то типы/указатели/ссылки со внутренним связыванием
Что ещё за типы в внутренним связыванием?
Alex5
1049 / 712 / 105
Регистрация: 12.04.2010
Сообщений: 1,790
22.07.2014, 14:00     Почему в файле все функции объявлены как static? #14
Цитата Сообщение от LighterV Посмотреть сообщение
Все функции помечены как static ... Есть какое-нибудь обоснование этому?
LighterV, см. пример. В файле "file1.cpp"

C++
1
2
3
4
5
6
7
8
9
10
11
12
//  file1.cpp
 
static int a()
{
    cout << "abcd";
    return 0;
}
 
int b()
{
    return 11;
}
В другом файле:
C++
1
2
3
4
5
6
7
8
9
10
11
12
//  file2.cpp
 
int a()
{
    int n = 1 + 2 + 3;
    return n;
}
 
int b()
{
    return 22;
}
Получаем ошибку:

Компоновка...
1>file1.obj : error LNK2005: "int __cdecl b(void)" ... уже определен ...

Для static функции a() ошибок нет. Имена static функций (и переменных) могут использоваться в других файлах для определения других объектов.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2014, 14:09     Почему в файле все функции объявлены как static?
Еще ссылки по теме:
Использоваение static функции из другого файла C++
Отличие static от объявление переменных ДО функции main C++
как в файле вывести все в стречку и не в столбик ?!!?! C++
Как можно функцию описаную в одном файле включить во все файлы проекта C++
Передача потока (текущ.позиции курсора в файле) как аргумент функции C++

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

Или воспользуйтесь поиском по форуму:
HighPredator
22.07.2014, 14:09     Почему в файле все функции объявлены как static?
  #15

Не по теме:

internal linkage = static, не? вроде так... не особо хорошая память на термины

Yandex
Объявления
22.07.2014, 14:09     Почему в файле все функции объявлены как static?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru