|
расширение области видимости переменной |
|
|
|
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 все равно выдается та же ошибка как мне быть в этом случае? можно конечно дать разные имена, но хочется разобраться почему компилятор выдает ошибки, если Си предоставляет возможность использования одноименных локальных и глобальных имен.
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
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.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|