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

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

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

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

22.07.2014, 11:46. Просмотров 888. Ответов 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++]Не могу объявить static функцию в header файле.
Отличие static от объявление переменных ДО функции main C++
В каком заголовочном файле находятся функции Sleep() и delay() и как правильно их использовать? C++
как в файле вывести все в стречку и не в столбик ?!!?! C++
Как можно функцию описаную в одном файле включить во все файлы проекта C++
Передача потока (текущ.позиции курсора в файле) как аргумент функции C++
C++ Массив в функции со static указателем на него
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12878 / 7264 / 810
Регистрация: 27.09.2012
Сообщений: 17,950
Записей в блоге: 2
Завершенные тесты: 1
22.07.2014, 11:51     Почему в файле все функции объявлены как static? #2
Цитата Сообщение от LighterV Посмотреть сообщение
Есть какое-нибудь обоснование этому?
Например, все функции там взаимосвязанны.
Цитата Сообщение от LighterV Посмотреть сообщение
Не понимаю, почему не разбить этот файл на несколько, чтобы удобнее было читать.
и прыгать по всем файлам?
Tulosba
:)
Эксперт С++
4390 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
22.07.2014, 12:05     Почему в файле все функции объявлены как static? #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Функция, объявленная статической в файле не доступна в других модулях. Т.о., если этот файл просто разбить хотя бы на две части (ничего особо не меняя), то функции в одной части не смогут напрямую обращаться к функциям из другой части.
9к строк это на самом деле не так уж и много для одного файла.
Кстати объявление функций statiс для сокрытия их от других единиц трансляции является устаревшим подходом. В современном C++ правильнее использовать безымянные пространства имен.
0x10
2455 / 1627 / 238
Регистрация: 24.11.2012
Сообщений: 4,003
22.07.2014, 12:28     Почему в файле все функции объявлены как static? #4
Цитата Сообщение от Tulosba Посмотреть сообщение
В современном C++ правильнее использовать безымянные пространства имен.
В 03 стандарте обозвали static устаревшим, потом одумались и из 11 это убрали.
Tulosba
:)
Эксперт С++
4390 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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
Форумчанин
Эксперт С++
4468 / 2830 / 224
Регистрация: 12.12.2009
Сообщений: 7,199
Записей в блоге: 1
Завершенные тесты: 1
22.07.2014, 13:02     Почему в файле все функции объявлены как static? #7
Цитата Сообщение от LighterV Посмотреть сообщение
но можно же убрать static и сделать заголовочные файлы и функции смогут общаться друг с другом.
Это уже принципиально другой подход. Если ф-ции скрывают в одном файле, значит это для чего-то понадобилось.
0x10
2455 / 1627 / 238
Регистрация: 24.11.2012
Сообщений: 4,003
22.07.2014, 13:05     Почему в файле все функции объявлены как static? #8
Цитата Сообщение от Tulosba Посмотреть сообщение
В связи с чем? Нашли что-то плохое в безымянном namespace?
static == internal linkage, т.е. по идее символ не должен нигде фигурировать в объектнике.
Безымянный неймспейс == украшение имен. Т.е. просто разные механизмы.
Tulosba
:)
Эксперт С++
4390 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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
5454 / 1820 / 335
Регистрация: 10.12.2010
Сообщений: 5,383
Записей в блоге: 3
22.07.2014, 13:25     Почему в файле все функции объявлены как static? #10
Я бы выразился чуть более точно: безымянный неймспейс в данном контексте -- более лучший механизм. Кстати, при разработке 11 стандарта депрекацию статика убрали, т.к. ни до кого не достучались почувствовали потенциальный баттхерт в совместимости с си.

Добавлено через 4 минуты
И, да, я не читал то, что выше.
0x10
2455 / 1627 / 238
Регистрация: 24.11.2012
Сообщений: 4,003
22.07.2014, 13:32     Почему в файле все функции объявлены как static? #11
Tulosba, на практике получается, что реализованы плюс-минус одинаково.
HighPredator, static писать короче)
HighPredator
5454 / 1820 / 335
Регистрация: 10.12.2010
Сообщений: 5,383
Записей в блоге: 3
22.07.2014, 13:46     Почему в файле все функции объявлены как static? #12
Цитата Сообщение от 0x10 Посмотреть сообщение
static писать короче)
Совершенно верно. Но, имхо, в контексте плюсов и шаблонов это уже не особо актуально. Кстати о птичках: если мне не изменяет память, то типы/указатели/ссылки со внутренним связыванием не могут выступать в качестве параметров шаблонов. Так, что если сие было притащено из си, то ... уупс... правка исходника. В общем и тут черти-что и сбоку бантик
Tulosba
:)
Эксперт С++
4390 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
22.07.2014, 13:58     Почему в файле все функции объявлены как static? #13
Цитата Сообщение от HighPredator Посмотреть сообщение
то типы/указатели/ссылки со внутренним связыванием
Что ещё за типы в внутренним связыванием?
Alex5
1032 / 695 / 102
Регистрация: 12.04.2010
Сообщений: 1,753
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 функций (и переменных) могут использоваться в других файлах для определения других объектов.
HighPredator
22.07.2014, 14:09
  #15

Не по теме:

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

Tulosba
22.07.2014, 14:17
  #16

Не по теме:

HighPredator, я имею в виду упомянутую ситуацию относительно применения в шаблоне.

HighPredator
5454 / 1820 / 335
Регистрация: 10.12.2010
Сообщений: 5,383
Записей в блоге: 3
22.07.2014, 14:34     Почему в файле все функции объявлены как static? #17
Tulosba, а, это что-то вроде такого:
C++
1
2
3
4
5
6
7
8
template <class T> class X { /* ... */ };
void f()
{
  struct S { /* ... */ };
 
  X<S> x3;  // error: local type used as template-argument
  X<S*> x4; // error: pointer to local type used as template-argument
}
Это пример из стандарта. Если аппроксимировать данный пример на механику статика, ситуация будет аналогичная.
Tulosba
:)
Эксперт С++
4390 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
22.07.2014, 14:37     Почему в файле все функции объявлены как static? #18
HighPredator, хм-м ... http://ideone.com/CHROgx
А вот в C++03 действительно ошибка http://ideone.com/YovRDB
DrOffset
6851 / 4062 / 927
Регистрация: 30.01.2014
Сообщений: 6,859
22.07.2014, 18:44     Почему в файле все функции объявлены как static? #19
Цитата Сообщение от LighterV Посмотреть сообщение
Есть какое-нибудь обоснование этому? Может быть static функции выполняются быстрее или что-нибудь ещё?
Android - это Linux. В Linux, когда ты линкуешь бинарник, если не предпринять специальных телодвижений, по-умолчанию экспортируются все функции и переменные с внешним связыванием. Пометив нужные только внутри программы (и\или модуля) функции как static, мы банально уменьшаем размер бинарника и избавляемся от потенциальных конфликтов имен при линковке. Особенно это актуально при написании модулей ядра.
В новых GCC появились средства контроля видимости имен, но static до сих пор используют. Переносимость важнее

Это в дополнение к уже сказанному в этой ветке.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2014, 08:22     Почему в файле все функции объявлены как static?
Еще ссылки по теме:

Почему переменная объявленная static работает не корректно? C++
C++ Ключевое слово static в объявлении функции
C++ Почему пропускает все функции?!
Использоваение static функции из другого файла C++
C++ Нужно ли функции с оператором глобального разрешения ставить сразу за классом,в котором объявлены?

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

Или воспользуйтесь поиском по форуму:
HighPredator
5454 / 1820 / 335
Регистрация: 10.12.2010
Сообщений: 5,383
Записей в блоге: 3
23.07.2014, 08:22     Почему в файле все функции объявлены как static? #20
Цитата Сообщение от DrOffset Посмотреть сообщение
В Linux, когда ты линкуешь бинарник, если не предпринять специальных телодвижений, по-умолчанию экспортируются все функции и переменные с внешним связыванием.
Мне казалось в винде тоже так, не?
Цитата Сообщение от DrOffset Посмотреть сообщение
Пометив нужные только внутри программы (и\или модуля) функции как static, мы банально уменьшаем размер бинарника
Можете мысль развить, а то мне что-то не совсем понятно?
Yandex
Объявления
23.07.2014, 08:22     Почему в файле все функции объявлены как static?
Ответ Создать тему
Опции темы

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