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

 
 
> расширение области видимости переменной
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
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 24)
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
dimka76
сообщение May 14 2009, 07:15
Сообщение #16


developer
****

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



Цитата(amw @ May 14 2009, 10:21) *
Уже говорили - *.cpp



..\WinAVR-20090313\doc\avr-libc\avr-libc-user-manual\FAQ.html

Цитата
Can I use C++ on the AVR?
Basically yes, C++ is supported (assuming your compiler has been configured and compiled to support it, of course). Source files ending in .cc, .cpp or .C will automatically cause the compiler frontend to invoke the C++ compiler. Alternatively, the C++ compiler could be explicitly called by the name avr-c++........................................


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


Знающий
****

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



Цитата(dimka76 @ May 14 2009, 08:38) *
Пробовал менять расширение файла с *.с на *.С.
Компилятор на :: перестал выдавать ошибки, но начал давать предупреждение на -std=gnu99.


Дык а что вас изумляет? gnu99 - это, наскока я понимаю, стандарт С99. А вы компилите C++...
Go to the top of the page
 
+Quote Post
dimka76
сообщение May 14 2009, 08:18
Сообщение #18


developer
****

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



Цитата(Непомнящий Евгений @ May 14 2009, 12:11) *
Дык а что вас изумляет? gnu99 - это, наскока я понимаю, стандарт С99. А вы компилите C++...


да вобще ничего не изумляет. Вопрос в том, как избавиться от предепреждения?


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


Знающий
****

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



Очевидно - убрать опцию --std=gnu99 для .C файлов smile.gif

Вот как ее убрать - хз, я из авр-студии не компилил...
Go to the top of the page
 
+Quote Post
mdmitry
сообщение May 14 2009, 13:02
Сообщение #20


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Забросить студию и собрать проект руками, написав или поправив makefile для Winavr. Есть в комплекте утилита для помощи в написании makefile. Есть документация на русском языке по make. Вообще-то, уже работа с make обсуждалась неоднократно.
В список компилируемых файлов внесите их с правильными расширениями
Код
# List C source files here. (C dependencies are automatically generated.)
SRC =

# List C++ source files here. (C dependencies are automatically generated.)
CPPSRC =

и поправьте опции компилятора для расширения сообщений о компиляции. Можете узнать много нового rolleyes.gif


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 14 2009, 18:33
Сообщение #21


Гуру
******

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



Цитата(dimka76 @ May 14 2009, 07:38) *
Действительно, я смутно представляю (точнее вообще не представляю) как в WinAVR создавать проекты на С++ и смешаные проекты ( Си + С++).
Но хоть что такое С++ и как оно стыкуется с С вы знаете? Про name mangling и вытекающий из него extern "C" для сишных функций слышали? Иначе лучше вам действительно переименовать локальную переменную.


--------------------
На любой вопрос даю любой ответ
"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 14 2009, 19:08
Сообщение #22


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

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



Вся эта возня с переменными, она для реальной работы или для учебы? По-моему поменять имена у глобальных переменных - дел на 10 минут, а нам задают вопросы третий день.
Go to the top of the page
 
+Quote Post
dimka76
сообщение May 15 2009, 05:08
Сообщение #23


developer
****

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



Цитата(Сергей Борщ @ May 14 2009, 22:33) *
Но хоть что такое С++ и как оно стыкуется с С вы знаете? Про name mangling и вытекающий из него extern "C" для сишных функций слышали? Иначе лучше вам действительно переименовать локальную переменную.


Что такое С++ я знаю. Про extern "C" для сишных функций я слышал, но речь идет не о фйнкции. А если вы это к #define __cplusplus, то я думал, что так WinAVR распознает, что прога написана на С++.



Цитата(sergeeff @ May 14 2009, 23:08) *
Вся эта возня с переменными, она для реальной работы или для учебы? По-моему поменять имена у глобальных переменных - дел на 10 минут, а нам задают вопросы третий день.



Для саморазвития с последующим применением в работе. Для поиска истины, если хотите. Просто человек я въедливый иногда бываю. Хочется разобраться.

Цитата
а нам задают вопросы третий день.


Но ведь никто никого не принуждает отвечать rolleyes.gif


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


Гуру
******

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



Цитата(dimka76 @ May 15 2009, 08:08) *
Что такое С++ я знаю.
Я тоже знаю, что такое кардиология. Но это не значит, что могу проводить операции на сердце или даже оказать первую помощь, если (тьфу-тьфу) кому-то станет плохо. По вашим вопросам понятно, что знания у вас если и есть, то поверхостные. Не обижайтесь.
Цитата(dimka76 @ May 15 2009, 08:08) *
Про extern "C" для сишных функций я слышал, но речь идет не о функции. А если вы это к #define __cplusplus,

Нет, это я к тому, что если вы переведете один из файлов проекта на плюсы - то сразу же получите ругань линкера, что из вашего плюсового файла не видны функции из сишных. А из вопроса про #define __cplusplus понятно, что никаких специальных действий для решения этого у вас не предусмотрено и сразу, с наскоку, решить это у вас не получится.


--------------------
На любой вопрос даю любой ответ
"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 15 2009, 08:04
Сообщение #25


developer
****

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



Цитата(Сергей Борщ @ May 15 2009, 11:10) *
Не обижайтесь.


Я и не обижаюсь. Про С++ я только читал. На практике не применял.

Цитата
Нет, это я к тому, что если вы переведете один из файлов проекта на плюсы - то сразу же получите ругань линкера, что из вашего плюсового файла не видны функции из сишных.


Как я уже выше говорил, я этот файл переводил в плюсы (давал ему расширение .С). Линкер не ругался. Потому, что этот файл не обращается к сишным (без плюсов) функциям. Наоборот, фунции из .с файлов, обращаются к функциям этого файла( которому я давал расширение .С). Но, опять таки, как я уже говорил выше, компилятор выдавал предупреждение на -std=gnu99.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st June 2025 - 22:02
Рейтинг@Mail.ru


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