статичні глобальні простори та анонімні простори імен у C ++


11
  1. Чому C ++ зробив якусь різницю між статичними глобальними (внутрішні зв’язки) та символами в неназваному просторі імен (зовнішній зв'язок, але жодним чином не посилатися на нього ззовні все-таки) при введенні останнього?

  2. Чи є якась із цих причин все-таки дійсною чи є нові?

  3. Чи залишилися місця, де вони все ще відрізняються, але довільне правило про те, що повинні бути анонімні глобальні об'єднання (або простору імен)static , і які вони?

  4. Якщо бонусні бали не мають жодних вагомих причин, щоб вони були різними, чи є прохання зробити їх рівнозначними?


Коли C ++ запровадив простори імен (C ++ 98), а конкретно безіменні простори імен, статичні глобалі були виснажені як застарілі та поступалися новій справі з великим ентузіазмом, хоча це було відмінено C ++ 11 :
Позбавлення статичного ключового слова… не більше?

Перед C ++ 11 символи з внутрішнім зв’язком не можна було використовувати як аргументи шаблону: Чому для C ++ 03 потрібні параметри шаблону для зовнішнього зв’язку?


Схоже, ви здебільшого відповіли на власне запитання, за винятком біта "відповідної реалізації"; можливо, ви повинні розглянути питання про видалення другої половини та надіслати її як відповідь? Або все ще є щось без відповіді?
Кайл Странд

@KyleStrand все це переформулював.
Дедуплікатор

Відповіді:


3

Я не думаю, що це відповідає на всі ваші запитання (чи будь-які з них?), Але ключова відмінність статичних оголошень на рівні файлу від анонімних просторів імен полягає в тому, що простори імен також застосовуються до типів (ви не можете оголосити staticтип у в тому ж сенсі ви оголошуєте змінну), тому простір імен є кращим, тому є одна ідіома, яка оголошує дані та типи, що охоплюють файли.

Прикладно, наступний код повинен складати просто чудово. (Не дуже корисно, оскільки ви не можете розрізняти обидва типи, але дозволено)

#include <iostream>

struct Foobar
{
    int   foo;
    float bar;
};

namespace
{

struct Foobar
{
    double baz;
};

} // namespace

int main()
{
    std::cout << "HELLO!\n";
}

Живе випробування тут .


Вона компілюється, оскільки ви не використовуєте Foobar в головній функції.
dshil

Що ще важливіше, що станеться, якщо інший .cpp-файл оголошує власну версію struct Foobar? Що ще гірше, припустимо, це зараз class Foobar. Подумайте, як ви плануєте створити конструктори для обох.
dgnuff
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.