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

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

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

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

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

Привет!
В исходном коде Android я нашёл один файл нативного кода на C/C++. Все функции помечены как static и располагаются в одном файле, который больше 9000 строк кода.
Не понимаю, почему не разбить этот файл на несколько, чтобы удобнее было читать. Есть какое-нибудь обоснование этому? Может быть static функции выполняются быстрее или что-нибудь ещё?
https://android.googlesource.com/pla...tiveCrypto.cpp
0
Лучшие ответы (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++
Почему пропускает все функции?!! Написала без функций, то же самое Подскажите в чем проблема #include <iostream> using namespace...

Может ли быть метод virtual static? И почему? - C++
Очень нужно объяснение! В интернете ничего конкретно про это не написано.

Почему переменная объявленная static работает не корректно? - C++
Переменная j=25 я её обозначил как static int j; и присвоил число 25. Значит эта переменная должна сохраняться и при выходе из функции....

определение функции в ЗАГОЛОВОЧНОМ файле. В основном предполагается переопределение ТЕЛА этой функции. Как это сделать, не правя хидер? - C++
Сабж, а подробнее если в заголовочном файле hider.h описана функция, допустим так: void f (); void f () { int per= 10; } ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,417
Записей в блоге: 3
Завершенные тесты: 1
22.07.2014, 11:51 #2
Цитата Сообщение от LighterV Посмотреть сообщение
Есть какое-нибудь обоснование этому?
Например, все функции там взаимосвязанны.
Цитата Сообщение от LighterV Посмотреть сообщение
Не понимаю, почему не разбить этот файл на несколько, чтобы удобнее было читать.
и прыгать по всем файлам?
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
22.07.2014, 12:05 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Функция, объявленная статической в файле не доступна в других модулях. Т.о., если этот файл просто разбить хотя бы на две части (ничего особо не меняя), то функции в одной части не смогут напрямую обращаться к функциям из другой части.
9к строк это на самом деле не так уж и много для одного файла.
Кстати объявление функций statiс для сокрытия их от других единиц трансляции является устаревшим подходом. В современном C++ правильнее использовать безымянные пространства имен.
3
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,031
22.07.2014, 12:28 #4
Цитата Сообщение от Tulosba Посмотреть сообщение
В современном C++ правильнее использовать безымянные пространства имен.
В 03 стандарте обозвали static устаревшим, потом одумались и из 11 это убрали.
2
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
22.07.2014, 12:29 #5
Цитата Сообщение от 0x10 Посмотреть сообщение
В 03 стандарте обозвали static устаревшим, потом одумались и из 11 это убрали.
В связи с чем? Нашли что-то плохое в безымянном namespace?
0
LighterV
4 / 4 / 0
Регистрация: 08.08.2013
Сообщений: 48
22.07.2014, 13:00  [ТС] #6
Цитата Сообщение от Croessmah Посмотреть сообщение
Например, все функции там взаимосвязанны.
На самом деле не все функции взаимосвязаны.

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

Цитата Сообщение от Tulosba Посмотреть сообщение
Функция, объявленная статической в файле не доступна в других модулях. Т.о., если этот файл просто разбить хотя бы на две части (ничего особо не меняя), то функции в одной части не смогут напрямую обращаться к функциям из другой части.
Это понятно, но можно же убрать static и сделать заголовочные файлы и функции смогут общаться друг с другом.
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
22.07.2014, 13:02 #7
Цитата Сообщение от LighterV Посмотреть сообщение
но можно же убрать static и сделать заголовочные файлы и функции смогут общаться друг с другом.
Это уже принципиально другой подход. Если ф-ции скрывают в одном файле, значит это для чего-то понадобилось.
0
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,031
22.07.2014, 13:05 #8
Цитата Сообщение от Tulosba Посмотреть сообщение
В связи с чем? Нашли что-то плохое в безымянном namespace?
static == internal linkage, т.е. по идее символ не должен нигде фигурировать в объектнике.
Безымянный неймспейс == украшение имен. Т.е. просто разные механизмы.
1
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
22.07.2014, 13:13 #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.
Короче говоря, для пользователя кода, как я понял "те же яйца, вид сбоку". Поправьте, если не так.
0
HighPredator
5542 / 1848 / 345
Регистрация: 10.12.2010
Сообщений: 5,455
Записей в блоге: 2
22.07.2014, 13:25 #10
Я бы выразился чуть более точно: безымянный неймспейс в данном контексте -- более лучший механизм. Кстати, при разработке 11 стандарта депрекацию статика убрали, т.к. ни до кого не достучались почувствовали потенциальный баттхерт в совместимости с си.

Добавлено через 4 минуты
И, да, я не читал то, что выше.
0
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,031
22.07.2014, 13:32 #11
Tulosba, на практике получается, что реализованы плюс-минус одинаково.
HighPredator, static писать короче)
0
HighPredator
5542 / 1848 / 345
Регистрация: 10.12.2010
Сообщений: 5,455
Записей в блоге: 2
22.07.2014, 13:46 #12
Цитата Сообщение от 0x10 Посмотреть сообщение
static писать короче)
Совершенно верно. Но, имхо, в контексте плюсов и шаблонов это уже не особо актуально. Кстати о птичках: если мне не изменяет память, то типы/указатели/ссылки со внутренним связыванием не могут выступать в качестве параметров шаблонов. Так, что если сие было притащено из си, то ... уупс... правка исходника. В общем и тут черти-что и сбоку бантик
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
22.07.2014, 13:58 #13
Цитата Сообщение от HighPredator Посмотреть сообщение
то типы/указатели/ссылки со внутренним связыванием
Что ещё за типы в внутренним связыванием?
0
Alex5
1052 / 715 / 105
Регистрация: 12.04.2010
Сообщений: 1,818
22.07.2014, 14:00 #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 функций (и переменных) могут использоваться в других файлах для определения других объектов.
0
HighPredator
22.07.2014, 14:09     Почему в файле все функции объявлены как static?
  #15

Не по теме:

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2014, 14:09
Привет! Вот еще темы с ответами:

Ключевое слово static в объявлении функции - C++
Доброго времени суток. У меня возник вопрос по поводу использования слово static в объявлении функции. На сколько мне известно данное...

Массив в функции со static указателем на него - C++
Здрасти, делаю задание на указатели из книги Хортона по Вижуал С++. Задачка: передать в функцию строку и чтобы функция запомнила строку. ...

Использоваение static функции из другого файла - C++
Всем добра! мне дали файл cmd.cpp с функцией: static void matchCommandParameters(int argc, char **argv, int * v, int * u, int *...

Отличие static от объявление переменных ДО функции main - C++
Может быть я не совсем точно выразился в заголовке. Интересует отличие объявление переменных ДО функции main и объявление через static. По...


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

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

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