C++ Локальные классы оказывается не такие уж и локальные

Тема в разделе "LANGS.C", создана пользователем _DEN_, 27 фев 2007.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    ...или статические функции не такие уж и статические :)

    Делаем foo.cpp и boo.cpp следующего содержания:

    Код (Text):
    1. // foo.cpp
    2.  
    3. #include <iostream>
    4.  
    5. static void proc()
    6. {
    7.     class Local
    8.     {
    9.     public:
    10.  
    11.         void LyaLyaLya()
    12.         {
    13.             std::cout << "foo!" << std::endl;
    14.         }
    15.     };
    16. }
    17.  
    18. int main()
    19. {
    20.     return 0;
    21. }
    Код (Text):
    1. // boo.cpp
    2.  
    3. #include <iostream>
    4.  
    5. static void proc()
    6. {
    7.     class Local
    8.     {
    9.     public:
    10.  
    11.         void LyaLyaLya()
    12.         {
    13.             std::cout << "boo!" << std::endl;
    14.         }
    15.     };
    16. }
    Билдемсо и получаем ошибку линковки. Господа одептеги, что по этому поводу говорит стандарт? Если говорит...
     
  2. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Это глюк компилятора, который сделал имя proc::Local::LyaLyaLya публичным.
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    green

    А что значит, простите, "публичное" имя? Бывает еще и не публичное? Это типа как у статик функций?
     
  4. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    _DEN_
    Да. В C/С++ имена по умолчанию публичные (public), т.е. доступные из других модулей компиляции.
    Чтобы сделать имя локальным для модуля, надо явно указать static (ну или использовать anonimous namespace, но это другая тема).
    В Асме, кстати, наоборот: имена по умолчанию локальные, и для доступности из других obj надо указать для них public.
     
  5. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    _DEN_
    какой компилер?
    нечто подобное было на rsdn'e. а еще александреску (или саттер, точно не помню) писал про то, как компилер ищет имена (есть несколько алго).
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    censored

    Это компиллер от 8-й студии.
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Хек ) Вроде бы вся функция, объявленная как static, должна быть видна только внутри одного исходного файла.

    ЗЫ. ПРоверил в Visual C++ 6.0:
    А вот G++ компилятор правильный =)

     
  8. MCNet

    MCNet New Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2006
    Сообщения:
    74
    Интересно как это gcc схавает
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    MCNet
    смотри мой пост выше ) схавал нормально.
     
  10. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Great

    Ну хоть что-то в нем правильно))
     
  11. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    У Интела такой проблемы тоже нет.
    Хотя за этот баг МС особо пинать не стоит - сам Страуструп сильно не советует юзать сишный static в С++ прогах - на то есть анонимные неймспейсы. Ну и путаницы с классовым static не будет.
     
  12. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    какая разница: статик, не статик.. все равно локальный класс ниоткуда не должен быть виден