Форум программистов, компьютерный форум CyberForum.ru

Использование имен предопределенных объектов в качестве имен переменных - C++

Восстановить пароль Регистрация
 
MicM
 Аватар для MicM
820 / 487 / 90
Регистрация: 29.12.2009
Сообщений: 1,097
Завершенные тесты: 1
19.07.2014, 12:13     Использование имен предопределенных объектов в качестве имен переменных #1
Есть код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
 
void func()
{
    int cout;
    cout <<cout <<endl;
}
 
int main()
{
    func ();
    return 0;
}
При его компиляции возникают ошибки, но на такие две программы компилятор не ругается:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
 
void func()
{
    int cout, cin;
    //cout <<cout <<endl;
}
 
int main()
{
    func ();
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
void func()
{
    int cout = 0, cin = 0;
    std::cout <<cout <<cin <<std::endl;
}
 
int main()
{
    func ();
    return 0;
}
В случае, если раскрыто пространство имен, в функции можно использовать имена "cout" и "cin" как имена переменных, только если в ней не используется ввод/вывод с помощью этих объектов. Иначе, использовать можно и объекты и имена переменных одновременно. Я так думаю. Так вот вопрос: эта ситуация как-то оговорена стандартом? И есть смысл писать так, или в определенных ситуациях это может привести к нежелательным последствиям?
Примеры компилировал в gcc 4.7.0 и MSVS 2010.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.07.2014, 12:13     Использование имен предопределенных объектов в качестве имен переменных
Посмотрите здесь:

C++ ошибка повторения имен переменных при использовании глобальной переменной
C++ изменение имен переменных
"Автозаполнение" имен типов/функций/переменных C++
C++ русские символы в качестве имен переменных
C++ Использование пространства имен
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
19.07.2014, 12:17     Использование имен предопределенных объектов в качестве имен переменных #2
Цитата Сообщение от MicM Посмотреть сообщение
И есть смысл писать так
Давать переменным имена, совпадающие с объектами стандартной библиотеки? Нет, только запутывает.

По стандарту не проконсультирую, но разрешение имен объектов начинается с локальной области видимости. Объявленные в ней имена перекрывают глобальные, чтобы к ним обратиться - используется оператор ::.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
 
void func()
{
    int cout = 42;
    ::cout << cout << endl;
}
 
int main()
{
    func();
    return 0;
}
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
19.07.2014, 12:26     Использование имен предопределенных объектов в качестве имен переменных #3
В первом варианте можно написать так:
C++
1
   cout <<cout << '\n';
но работать это будет совсем не так, как ожидается
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
19.07.2014, 12:28     Использование имен предопределенных объектов в качестве имен переменных #4
Цитата Сообщение от Tulosba Посмотреть сообщение
В строке 7 первого примера имеется неоднозначность какую cout использовать.
Там все однозначно - используется локальная переменная, просто нет оператора<<(int, std::basic_ostream<blablabla>)
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
19.07.2014, 12:31     Использование имен предопределенных объектов в качестве имен переменных #5
Цитата Сообщение от MicM Посмотреть сообщение
При его компиляции возникают ошибки
Вот на них и стоит сделать акцент. Вот что выдал gcc:
error: invalid operands of types ‘int’ and ‘<unresolved overloaded function type>’ to binary ‘operator<<’
И я думаю, это многое должно объяснить.

Добавлено через 37 секунд
Цитата Сообщение от 0x10 Посмотреть сообщение
Там все однозначно
Я поэтому и дропнул пост Но, не достаточно быстро, видимо
MicM
 Аватар для MicM
820 / 487 / 90
Регистрация: 29.12.2009
Сообщений: 1,097
Завершенные тесты: 1
19.07.2014, 12:32  [ТС]     Использование имен предопределенных объектов в качестве имен переменных #6
0x10, к глобальным именам будут относится различные объекты и функции библиотек?

Добавлено через 34 секунды
Цитата Сообщение от Tulosba Посмотреть сообщение
Вот на них и стоит сделать акцент. Вот что выдал gcc:
Да, это и выдал
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
19.07.2014, 12:34     Использование имен предопределенных объектов в качестве имен переменных #7
Цитата Сообщение от MicM Посмотреть сообщение
к глобальным именам будут относится различные объекты и функции библиотек?
Так Вы написали
C++
1
using namespace std;
то имена стандартной библиотеки попали в глобальное пространство имен в данном случае.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
19.07.2014, 12:36     Использование имен предопределенных объектов в качестве имен переменных #8
Цитата Сообщение от MicM Посмотреть сообщение
к глобальным именам будут относится различные объекты и функции библиотек?
Скапитаню: к глобальным идентификаторам будут относиться идентификаторы, находящиеся в глобальной области видимости. Не важно, пользовательские или библиотечные.
MicM
 Аватар для MicM
820 / 487 / 90
Регистрация: 29.12.2009
Сообщений: 1,097
Завершенные тесты: 1
19.07.2014, 12:37  [ТС]     Использование имен предопределенных объектов в качестве имен переменных #9
Цитата Сообщение от Tulosba Посмотреть сообщение
но работать это будет совсем не так, как ожидается
Никак не отработало, просто ничего не вывело
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
19.07.2014, 12:38     Использование имен предопределенных объектов в качестве имен переменных #10
Цитата Сообщение от MicM Посмотреть сообщение
Никак не отработало, просто ничего не вывело
Вывода быть и не должно, в данном случае это обычный оператор битового сдвига.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
19.07.2014, 12:39     Использование имен предопределенных объектов в качестве имен переменных #11
Цитата Сообщение от MicM Посмотреть сообщение
Никак не отработало, просто ничего не вывело
Потому что была выполнена операция побитового сдвига влево два раза
MicM
 Аватар для MicM
820 / 487 / 90
Регистрация: 29.12.2009
Сообщений: 1,097
Завершенные тесты: 1
19.07.2014, 12:44  [ТС]     Использование имен предопределенных объектов в качестве имен переменных #12
Блин, точно
Ведь локальная переменная cout перекрыла глобальный идентификатор cout и следующая запись стала рассматриваться как побитовый сдвиг.
C++
1
cout <<cout <<'\n';
А в случае с '\n' сдвиг будет производится на количество позиций, которое равно коду этого символа в ASCII?
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,561
Записей в блоге: 17
19.07.2014, 12:49     Использование имен предопределенных объектов в качестве имен переменных #13
Ибо нечего бездумно раскрывать пространства имен.
Ну и вероятно имеет банальная опечатка: не cout а count
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
19.07.2014, 12:49     Использование имен предопределенных объектов в качестве имен переменных #14
Цитата Сообщение от MicM Посмотреть сообщение
которое равно коду этого символа в ASCII?
Я бы сказал: на static_cast<int>('\n') бит
MicM
 Аватар для MicM
820 / 487 / 90
Регистрация: 29.12.2009
Сообщений: 1,097
Завершенные тесты: 1
19.07.2014, 12:54  [ТС]     Использование имен предопределенных объектов в качестве имен переменных #15
Цитата Сообщение от Avazart Посмотреть сообщение
Ну и вероятно имеет банальная опечатка: не cout а count
Не, так изначально и было задумано. Просто читаю сейчас читаю С.Прата "Язык программирования С++" и там прочитал это. Вот и заинтересовался и решил разобраться
Миниатюры
Использование имен предопределенных объектов в качестве имен переменных  
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
19.07.2014, 12:56     Использование имен предопределенных объектов в качестве имен переменных #16
MicM, ну очень спорно написано, ибо на предыдущей страницы я приводил пример, который показывает, что использовать можно.
MicM
 Аватар для MicM
820 / 487 / 90
Регистрация: 29.12.2009
Сообщений: 1,097
Завершенные тесты: 1
19.07.2014, 12:59  [ТС]     Использование имен предопределенных объектов в качестве имен переменных #17
0x10, ага, вот тоже нашел
http://msdn.microsoft.com/ru-ru/library/b451xz31.aspx
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
19.07.2014, 13:10     Использование имен предопределенных объектов в качестве имен переменных #18
Цитата Сообщение от MicM Посмотреть сообщение
Просто читаю сейчас читаю С.Прата "Язык программирования С++"
Издание не древнее случаем? Может там ещё пространств имен не было.
Хотя по первому сообщению так и не скажешь.
MicM
 Аватар для MicM
820 / 487 / 90
Регистрация: 29.12.2009
Сообщений: 1,097
Завершенные тесты: 1
19.07.2014, 13:14  [ТС]     Использование имен предопределенных объектов в качестве имен переменных #19
Tulosba, 6-е издание, 2012 год
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.07.2014, 13:23     Использование имен предопределенных объектов в качестве имен переменных
Еще ссылки по теме:

C++ использование пространства имен
C++ Сортировка объектов через указатели, основанная на алфавитном порядке имен
C++ Не возникает ли коллизия имен, если использовать два пространства имен, и в каждом из них будут одноименные?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
19.07.2014, 13:23     Использование имен предопределенных объектов в качестве имен переменных #20
Цитата Сообщение от MicM Посмотреть сообщение
6-е издание, 2012 год
Ну тогда не знаю. Может трудности перевода А может и афтор шалит.
Кстати ещё для укрепления материала могу такой код предложить рассмотреть:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
int cout = 42;
 
void func()
{
    int cout = 100500;
    printf( "%p\n", &std::cout ); // стандартный поток вывода
    printf( "%d\n", ::cout ); // глобальная переменная
    printf( "%d\n", cout ); // локальная переменная 
}
 
int main()
{
    func();
    return 0;
}
http://ideone.com/HcmCjb
Yandex
Объявления
19.07.2014, 13:23     Использование имен предопределенных объектов в качестве имен переменных
Ответ Создать тему
Опции темы

Текущее время: 15:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru