Я постараюсь ответить на ваш вопрос, хотя это старый вопрос, и он не выглядит очень важным (это действительно не очень важно сам по себе), и он уже получил неплохие ответы. Причина, по которой я хочу ответить, заключается в том, что она связана с фундаментальными проблемами стандартной эволюции и языкового дизайна, когда язык основан на существующем языке: , когда языковые функции должны быть устаревшими, удалены или изменены несовместимыми способами?
В C++ можно использовать статический ключевое слово в пределах единицы трансляции, чтобы повлиять на видимость символа (либо переменной или объявление функции).
Связь на самом деле.
В n3092, это осуждается:
Deprecation указывает:
- намерение удалить некоторые функции в будущем; это не означает, что устаревшие функции будут удалены в следующей стандартной версии или что их нужно удалить «скоро» или вообще. И неисчерпаемые функции могут быть удалены в следующей стандартной версии.
- Формальная попытка препятствовать ее использованию.
Последнее значение имеет важное значение. Хотя никогда не существует официального обещания, что ваша программа не будет нарушена, иногда молча, по следующему стандарту, комитет должен попытаться избежать нарушения «разумного» кода. Устаревание должно сказать программистам, что нецелесообразно зависеть от некоторой функции.
Он подчеркивает, что для совместимости с C (и с возможностью компиляции C-программ как C++) усталость раздражает. Однако компиляция программы C непосредственно как C++ может быть разочаровывающим опытом, поэтому я не уверен, что это требует рассмотрения.
Очень важно сохранить общее подмножество C/C++, особенно для файлов заголовков. Конечно, глобальные объявления static
являются декларациями символа с внутренней связью, и это не очень полезно в файле заголовка.
Но проблема никогда не совместима с C, это совместимость с существующим C++: существует множество существующих действующих программ на C++, которые используют глобальные объявления static
. Этот код не просто формально легален, он звучит, так как использует четко определенную языковую функцию так, как предполагается, будет использоваться.
Просто потому, что теперь есть «лучший способ» (по мнению некоторых) сделать что-то, не делает программы написанными по-старому «плохим» или «необоснованным». Возможность использования ключевого слова static
при объявлениях объектов и функций в глобальной области видимости хорошо понимается как в сообществах C, так и в C++ и наиболее часто используется правильно.
В том же духе, я не собираюсь менять C-стиле бросает в double
к static_cast<double>
только потому, что «слепки C-типа плохо», а static_cast<double>
добавляет нулевой информации и нулевой безопасности.
Идея, что всякий раз, когда изобретается новый способ сделать что-то, все программисты спешат переписать свой существующий четко определенный рабочий код, просто сумасшедший. Если вы хотите удалить все унаследованные проблемы и проблемы, вы не меняете C++, вы изобретаете новый язык программирования. Полу-удаление одного использования static
вряд ли делает C++ менее C-уродливым.
Изменения кода требуют оправдания, а «старый - плохой» никогда не является оправданием для изменений кода.
Нарушение языковых изменений требует очень сильного оправдания. Сделать язык немного проще, никогда не является оправданием для разрыва.
Причины, по которым static
являются плохими, являются довольно слабыми, и даже не ясно, почему не оба объекта и объявления функций не устарели вместе - придание им различной обработки вряд ли упростит или упростит C++.
Итак, действительно, это печальная история. Не из-за практических последствий, которые он имел: он имел ровно нулевые практические последствия. Но поскольку это свидетельствует о явном отсутствии здравого смысла в комитете ИСО.
Вы объявляете объекты в области пространства имен в C? –
Хех, thx, нашел, где его взять. Пытался удалить комментарий, но ты избил меня там. –
Вопрос возник из http://stackoverflow.com/questions/4725204/use-of-static-variables-and-functions-in-global-scope/4725237#4725237 –