реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> расширение области видимости переменной
dimka76
сообщение May 13 2009, 09:46
Сообщение #1


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Доброго времени суток.

Использую WinAVR-20090313

имеются две переменные с одинаковыми имнами: локальная и глобальная

язык Си позволяет обратиться из функции к глобальной переменной, если в этой функции имеется одноименная переменная следующим образом
Код
int i;

void foo(void)
{
  int i, k, e;

  k = i; // i локальная
  e = ::i; // i глобальная

}



у меня компилятор в этом случае выдает ошибку.
может этот оператор расширения области видимости присутствует только в C++ ? Я пробовал в начало файла добавлять следующее определение
Код
#ifndef __cplusplus
#define __cplusplus
#endif


все равно выдается та же ошибка

как мне быть в этом случае?

можно конечно дать разные имена, но хочется разобраться почему компилятор выдает ошибки, если Си предоставляет возможность использования одноименных локальных и глобальных имен.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение May 13 2009, 09:59
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Даже если определить локальную переменную, совпадающую с глобальной, нормальный компилятор предупреждает "variable shadowed by..." или что-то в этом духе.
Так делать не надо, ибо это источник ошибок.
:: - это точно из плюсов.
И вообще, переменные должны иметь осмысленные имена, а не i,j,k (тем более глобальные)


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
dimka76
сообщение May 13 2009, 10:04
Сообщение #3


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Цитата(MrYuran @ May 13 2009, 13:59) *
:: - это точно из плюсов.


но я же делал #define __cplusplus
а ошибку все равно выдавало


Цитата(MrYuran @ May 13 2009, 13:59) *
И вообще, переменные должны иметь осмысленные имена, а не i,j,k (тем более глобальные)


это я здесь для примера привел


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
bus16
сообщение May 13 2009, 10:34
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 78
Регистрация: 10-01-07
Пользователь №: 24 270



Цитата(dimka76 @ May 13 2009, 14:04) *
но я же делал #define __cplusplus
а ошибку все равно выдавало

Вероятно надо использовать G++ - скрипт править
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 13 2009, 11:55
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(dimka76 @ May 13 2009, 13:04) *
но я же делал #define __cplusplus
а ошибку все равно выдавало
С тем же успехом можно было написать #define __this_program_works.
Чтобы компилировать в режиме С++ файл должен иметь расширение cpp, а в makefile должно быть прописано правило компиляции .cpp


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
dimka76
сообщение May 13 2009, 12:21
Сообщение #6


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Цитата(Сергей Борщ @ May 13 2009, 15:55) *
С тем же успехом можно было написать #define __this_program_works.
Чтобы компилировать в режиме С++ файл должен иметь расширение cpp, а в makefile должно быть прописано правило компиляции .cpp


если вас не затруднит, не подскажите, что писать в makefile

и еще

например в pgmspace.h есть такое определение
Код
#ifdef __cplusplus
extern "C" {
#endif


значит #define __cplusplus компилятор должен понимать


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
SysRq
сообщение May 13 2009, 12:24
Сообщение #7


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Код
int i;

int get_i(void)
{
  return i;
}

void foo(void)
{
  int i, k, e;

  k = i; // i локальная
  e = get_i(); // i глобальная

}
Go to the top of the page
 
+Quote Post
dimka76
сообщение May 13 2009, 12:26
Сообщение #8


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Цитата(SysRq @ May 13 2009, 16:24) *
Код
int i;

int get_i(void)
{
  return i;
}

void foo(void)
{
  int i, k, e;

  k = i; // i локальная
  e = get_i(); // i глобальная

}


можно и так, но громоздко. тогда уж лучше дать разные имена и не городить лишние функции


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
SysRq
сообщение May 13 2009, 12:30
Сообщение #9


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(dimka76 @ May 13 2009, 16:26) *
тогда уж лучше дать разные имена и не городить лишние функции

Засуньте все глобальные переменные в отдельный namespace, ежели вам так хочется имен одинаковых.
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение May 13 2009, 13:45
Сообщение #10


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



Цитата(dimka76 @ May 13 2009, 15:21) *
...
значит #define __cplusplus компилятор должен понимать

Этот дефайн как раз компилятор определяет, когда запущен в режиме С++.
У вас причина и следствие перепутались.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 13 2009, 17:29
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(dimka76 @ May 13 2009, 15:21) *
если вас не затруднит, не подскажите, что писать в makefile
то же самое, что и для файла с расширением .c
Цитата(dimka76 @ May 13 2009, 15:21) *
например в pgmspace.h есть такое определение
Код
#ifdef __cplusplus
extern "C" {
#endif
значит #define __cplusplus компилятор должен понимать
Компилятор не понимает и не может видеть #define. #define - директива препроцессора. Компилятор получает текст, в котором препроцессор уже сделал все текстовые подстановки из #define


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 13 2009, 18:30
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Никак не возьму в толк. Какая разница?

1. В "С" программе глобальным и локальным переменным дать разные имена.
2. Перегнать весь проект в С++ (что автор смутно себе представляет) и перед глобальными переменными поставить ::

По любому - чисто правка текста в редакторе.
Go to the top of the page
 
+Quote Post
dimka76
сообщение May 14 2009, 04:38
Сообщение #13


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Действительно, я смутно представляю (точнее вообще не представляю) как в WinAVR создавать проекты на С++ и смешаные проекты ( Си + С++).
Использую связку WinAVR + AVRStudio, а там makefile создается автоматически. Пробовал менять расширение файла с *.с на *.С.
Компилятор на :: перестал выдавать ошибки, но начал давать предупреждение на -std=gnu99. Пробовал использовать MFile из пакета WinAVR, но для опиции -std там всего четыре альтернативы и на все компилятор выдает предупреждения при использовании файла программы с расширением *.С.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение May 14 2009, 06:19
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



А расширение .cpp не помогает?
Go to the top of the page
 
+Quote Post
amw
сообщение May 14 2009, 06:21
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(dimka76 @ May 14 2009, 07:38) *
Пробовал менять расширение файла с *.с на *.С.

Уже говорили - *.cpp


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 19:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.01484 секунд с 7
ELECTRONIX ©2004-2016