|
расширение области видимости переменной |
|
|
|
May 13 2009, 09:46
|

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 все равно выдается та же ошибка как мне быть в этом случае? можно конечно дать разные имена, но хочется разобраться почему компилятор выдает ошибки, если Си предоставляет возможность использования одноименных локальных и глобальных имен.
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 24)
|
May 13 2009, 10:04
|

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

|
Цитата(MrYuran @ May 13 2009, 13:59)  :: - это точно из плюсов. но я же делал #define __cplusplus а ошибку все равно выдавало Цитата(MrYuran @ May 13 2009, 13:59)  И вообще, переменные должны иметь осмысленные имена, а не i,j,k (тем более глобальные) это я здесь для примера привел
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
May 13 2009, 10:34
|
Частый гость
 
Группа: Свой
Сообщений: 78
Регистрация: 10-01-07
Пользователь №: 24 270

|
Цитата(dimka76 @ May 13 2009, 14:04)  но я же делал #define __cplusplus а ошибку все равно выдавало Вероятно надо использовать G++ - скрипт править
|
|
|
|
|
May 13 2009, 11:55
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
May 13 2009, 12:21
|

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 компилятор должен понимать
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
May 13 2009, 12:26
|

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 глобальная
} можно и так, но громоздко. тогда уж лучше дать разные имена и не городить лишние функции
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
May 13 2009, 17:29
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
May 14 2009, 06:21
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(dimka76 @ May 14 2009, 07:38)  Пробовал менять расширение файла с *.с на *.С. Уже говорили - *.cpp
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
May 14 2009, 07:15
|

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++........................................
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
May 14 2009, 13:02
|

Начинающий профессионал
    
Группа: Свой
Сообщений: 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 = и поправьте опции компилятора для расширения сообщений о компиляции. Можете узнать много нового
--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
|
|
|
|
|
May 15 2009, 05:08
|

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 минут, а нам задают вопросы третий день. Для саморазвития с последующим применением в работе. Для поиска истины, если хотите. Просто человек я въедливый иногда бываю. Хочется разобраться. Цитата а нам задают вопросы третий день. Но ведь никто никого не принуждает отвечать
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
May 15 2009, 07:10
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
May 15 2009, 08:04
|

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

|
Цитата(Сергей Борщ @ May 15 2009, 11:10)  Не обижайтесь. Я и не обижаюсь. Про С++ я только читал. На практике не применял. Цитата Нет, это я к тому, что если вы переведете один из файлов проекта на плюсы - то сразу же получите ругань линкера, что из вашего плюсового файла не видны функции из сишных. Как я уже выше говорил, я этот файл переводил в плюсы (давал ему расширение .С). Линкер не ругался. Потому, что этот файл не обращается к сишным (без плюсов) функциям. Наоборот, фунции из .с файлов, обращаются к функциям этого файла( которому я давал расширение .С). Но, опять таки, как я уже говорил выше, компилятор выдавал предупреждение на -std=gnu99.
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|