![]() |
|
Модераторы: bsa |
![]()
|
|
| Compositum |
|
||||
|
Senior developer ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 430 Регистрация: 6.1.2008 Где: Санкт-Петербург Репутация: нет Всего: 1 |
Си (C89):
При компиляции получаю ошибку, текст которой мне не способствует в понимании того, что именно не понравилось компилятору:
Это сообщение отредактировал(а) Compositum - 12.6.2011, 09:22 |
||||
|
|||||
| triclosan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 515 Регистрация: 18.8.2006 Репутация: 2 Всего: 12 |
||||
|
||||
| Compositum |
|
||||
|
Senior developer ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 430 Регистрация: 6.1.2008 Где: Санкт-Петербург Репутация: нет Всего: 1 |
подправил код и добавил комментарии, чтобы пояснить ход своих соображений:
Результат компиляции:
Это сообщение отредактировал(а) Compositum - 12.6.2011, 09:48 |
||||
|
|||||
| triclosan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 515 Регистрация: 18.8.2006 Репутация: 2 Всего: 12 |
||||
|
||||
| Compositum |
|
||||||
|
Senior developer ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 430 Регистрация: 6.1.2008 Где: Санкт-Петербург Репутация: нет Всего: 1 |
Спасибо, это я ошибся - конечно же нужен static. Исправил. Однако при компиляции всё ещё получаю ошибку:
|
||||||
|
|||||||
| triclosan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 515 Регистрация: 18.8.2006 Репутация: 2 Всего: 12 |
покажите код пожалуйста
|
|||
|
||||
| Compositum |
|
||||||
|
Senior developer ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 430 Регистрация: 6.1.2008 Где: Санкт-Петербург Репутация: нет Всего: 1 |
Добавлено @ 10:33 Если я объявлю структуру так:
т.е. определю и некую переменную с именем 'x', то всё компилируется и работает нормально, несмотря на то, что 'x' я нигде более не использую... Однако мне бы не хотелось объявлять в коде ненужные мне переменные... Версия используемого мною компилятора: gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4) Это сообщение отредактировал(а) Compositum - 12.6.2011, 10:37 |
||||||
|
|||||||
| asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
потому что вы просто объявляете тип данных, зачем вам статик писать? его можно писать только перед переменными, а у вас объявление типа, когда вы "х" добавляете это уже и переменная.
|
|||
|
||||
| Compositum |
|
|||
|
Senior developer ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 430 Регистрация: 6.1.2008 Где: Санкт-Петербург Репутация: нет Всего: 1 |
А вон оно как... Спасибо, я-то думал, что структуре так же можно назначать область видимости (в C# точно можно)... Т.е. в C (C89/C99) помечать как static можно только переменные и функции, а структуры, объединения, перечисления нельзя? Я не нашёл информации по этому вопросу ни у Шильдта, ни у Ритчи... |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
просто функции объявлять static не имеет смысла, т.к. они и так static. и потом, static не определяет область видимости. static говорит о том, в какой памяти выделять переменную - в статической или на стеке. Например:
доступ к этой static-переменной возможен только из этой функции, а память будет выделена не на стеке, в глобальной памяти. И её значение не будет теряться при выходе из функции. А объявлять глобальные переменные static тоже не имеет смысла, т.к. они и так выделяются в статической памяти. Это сообщение отредактировал(а) borisbn - 12.6.2011, 11:58 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
||||
|
||||
| volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Имхо не совсем так. функции по умолчанию не статик, а глобальные. статик перед функцией, говорит компилятору что данная функция видима только из этого модуля. без статик она считается глабальной.
тоже самое. статик перед глобальными переменными, не определяет способ размещения (в статической или динамической), а определяет область видимости для переменной. вобщем и перед функциями, и перед глобальными переменными, статик имеет определенный смысл. например мы можем иметь несколько одноименных функций в программе, в каждом модуле (единице трансляции) своя static int func (); без слова static, не скомпилируется, линкер будет жаловаться. int func (); alredy have a body Тоже самое с глобальными переменными. |
||||
|
|||||
| Compositum |
|
||||||||||||||
|
Senior developer ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 430 Регистрация: 6.1.2008 Где: Санкт-Петербург Репутация: нет Всего: 1 |
Вы меня не поняли, я говорил не о локальных переменных, объявленных как static... Пример: Предположим, что я написал некий файл z.c, в котором определил переменную и функцию:
обратите внимание - переменная и функция определены не как static. Теперь я пишу файл y.c, в коде которого хочу воспользоваться переменной ch и функцией mymsg:
Результат:
Как видим - всё замечательно работает. Но в том случае, если я захочу, чтобы какие-то глобальные переменные и/или функции, определённые мною в файле z.c не были доступны вне этого файла (т.е. хочу спрятать их от посторонних глаз, ибо они - для внутреннего использования в рамках файла z.c), то я должен помечать их атрибутом static. В этом случае из др. файлов получить доступ к этим элементам не смогут (как и требуется). Модифицирую файл z.c (файл y.c оставляю прежним):
Теперь компилирую:
Как видим - компилятор "не находит" объекты `ch' и `mymsg' - оно и понятно, я же объявил их как static, ограничив тем самым область их видимости границами файла z.c). Возвращаясь к теме настоящего топика - когда я говорил о том, что хочу структуру определить как static, то имел в виду, что её область видимости должна быть такой же как у глобальной переменной или функции, объявленных как static - т.е. чтобы структура была не видна за границами файла. |
||||||||||||||
|
|||||||||||||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
||||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
да, да, да... совсем забыл про extern. он и делает возможность "увидеть" глобальные переменные.
Старый стал, начал забывать Си -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |