Все компиляторы C++ позволяют использовать статическую членскую переменную класса интервала константы в качестве связанного массива?

Вот некоторые идеи получить более более простой дизайн:

  • читает некоторые книги программирования, и статьи, и затем применяют их в Вашей работе и пишут код
  • , читает много кода (хороший и плохой) записанный другими людьми (как проекты С открытым исходным кодом) и учатся видеть, какие работы и что не делает
  • системы поддержки сборки (модульные тесты), чтобы позволить экспериментированиям с Вашим кодом
  • управление версиями использования включить откат, если те экспериментирования понимают неправильно поворот
  • TDD (разработка через тестирование) и , BDD (поведение управляемая разработка)
  • изменяет Ваше отношение, спрашивает, как можно сделать его так, это , "это просто работает" (конвенция по конфигурации могла помочь там; или спросите, как Apple сделала бы это)
  • практика (как джазовые музыканты - затор с кодом, попробуйте Kata Кода)
  • , пишут тот же код многократно, с различными языками, и через какое-то время передал
  • , учат новые языки с новыми понятиями (если Вы используете статический язык, изучаете динамический; если Вы используете процедурный язык, изучаете функциональный;...) [один язык в год о праве]
  • , просят, чтобы кто-то для рассмотрения Вас кодировал и активно спросил, как можно сделать код более простым и более изящным ( и затем сделать его )
  • , получают годы под поясом путем выполнения выше вещей (время помогает активному уму)

8
задан sharptooth 25 August 2009 в 11:54
поделиться

9 ответов

Да, это на 100% законно и должно быть переносимым. Стандарт C ++ говорит об этом в 5.19 - Постоянные выражения "(выделено мной):

В некоторых случаях C ++ требует выражений, которые вычисляют целочисленную или перечисляемую константу: как границы массива (8.3.4, 5.3.4), как case -выражения (6.4.2), как длины битовых полей (9.6), как инициализаторы перечислителя (7.2), как инициализаторы статических элементов (9.4.2), и как целочисленные или перечисляемые аргументы шаблона, не являющиеся типами (14.3).

 константное выражение:
 условное выражение

Целочисленное константное выражение может включать только литералы (2.13), перечислители, константные переменные или статические элементы данных целочисленного или перечислительного типов, инициализированные константными выражениями (8.5), параметры шаблона, не являющиеся типами интегрального или типы перечисления и выражения sizeof.

Тем не менее, похоже, что VC6 его не поддерживает. См. ответ StackedCrooked для хорошего обходного пути. Фактически, я обычно предпочитаю метод enum , который StackedCrooked упоминает для этого типа вещей.

В качестве к сведению, метод « static const » работает в VC9, GCC 3.4.5 (MinGW), Comeau и Digital Mars.

И не забывайте, что если вы используете член "static const", вам потребуется его определение в дополнение к объявлению строго Говорящий.

4
ответ дан 5 December 2019 в 04:37
поделиться

Такое поведение допустимо в соответствии со стандартом C ++. Любой последний компилятор должен поддерживать его.

13
ответ дан 5 December 2019 в 04:37
поделиться

Это стандартный C ++ уже более десяти лет. Он даже поддерживается VC - чего еще вы хотите? (@Neil: А что насчет SunCC? : ^> )

6
ответ дан 5 December 2019 в 04:37
поделиться

Я считаю, что Visual Studio 2005 и выше его поддерживает. Также компилятор XCode C ++ (на самом деле это gcc).

Если вы хотите быть в безопасности, вы всегда можете использовать старый способ перечисления, который я узнал от Effective C ++. Это звучит так:

class Class {

 private:
     enum {
        numberOfColors = 16
     };
     COLORREF colors[numberOfColors];
 };

Надеюсь, это поможет.

6
ответ дан 5 December 2019 в 04:37
поделиться

Я почти уверен, что это также будет работать с gcc и Solaris, но я не могу проверить это на данный момент.

В будущем вы могли бы расширить эту идею следующим образом:

template<int size>
class Class {
private:
    COLORREF colors[size];
};

и используйте его так:

Class<5> c;

, чтобы не ограничивать вас одним размером буфера в вашем приложении.

2
ответ дан 5 December 2019 в 04:37
поделиться

Я перестал беспокоиться о переносимости этой версии много лет назад. Возможно, еще существуют компиляторы, которые его не поддерживают, но в последнее время я не встречал ни одного из них.

1
ответ дан 5 December 2019 в 04:37
поделиться

Это правильный C ++, и большинство (все?) Современных компиляторов поддерживают его. Если вы используете ускорение, вы можете получить переносимую поддержку этой функции в виде макроса BOOST_STATIC_CONSTANT :

class Class {
 private:
     BOOST_STATIC_CONSTANT(int, numberOfColors = 16);
     COLORREF colors[numberOfColors];
 };

Макрос расширяется до static const int numberOfColors = 16 , если компилятор поддерживает это, в противном случае используется enum {numberOfColors = 16}; .

13
ответ дан 5 December 2019 в 04:37
поделиться

На подобные вопросы можно ответить, сославшись на спецификацию ISO C ++, но эту спецификацию сложно понять и сложнее прочитать. Я думаю, что самый простой ответ зависит от двух вещей:

  • Microsoft Visual Studio 2005 и выше является относительно совместимой реализацией C ++. Если он позволяет вам что-то делать, скорее всего, это стандарт.
  • Загрузите что-нибудь вроде Code :: Blocks, чтобы компилятор GCC попробовал все. Если он работает в MS и GCC, скорее всего, это действительно стандарт.
-1
ответ дан 5 December 2019 в 04:37
поделиться

Помимо других ответов, вы можете использовать следующую функцию для определения количества элементов в статически размещенных массивах:

template<typename T, size_t length>
size_t arrayLength(T (&a)[length])
{
    return length;
}
3
ответ дан 5 December 2019 в 04:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: