Nano Hash - криптовалюты, майнинг, программирование

ошибка компиляции C2099: инициализатор не является константой

Следующий код не компилируется:

const int a = 0;

struct Test
{
    int b;
};

static const struct Test test = 
{
    a
};

Это сокращенный пример того, что я действительно пытаюсь сделать, но что я делаю не так?


  • Вы пробовали скомпилировать это в отдельный проект? Мне кажется, это идеально. 26.05.2011

Ответы:


1

В версии C89 / 90 языка C все агрегатные инициализаторы должны состоять только из констант. В терминологии языка C константа типа int является буквальным значением, например 10, 20u, 0x1 и т. Д. Члены перечисления также являются константами. Переменные типа const int не являются константами в C. Вы не можете использовать переменную const int в агрегатном инициализаторе. (По этой причине в языке C, когда вам нужно объявить именованную константу, вы должны использовать либо #define, либо enum, но не квалификатор const.)

В C99 это требование для агрегатных инициализаторов было ослаблено. Теперь можно использовать неконстанты в агрегатных инициализаторах локальных объектов. Однако для статических объектов (как в вашем примере) требование все еще сохраняется. Итак, даже в C99 вам придется либо использовать

#define a 0

или используйте именованную константу перечисления, как предложено в ответе @R ...

25.05.2011
  • +1, более полный, чем мой ответ, даже если немного отклониться от него на несколько пунктов. Возможно, вы захотите использовать выражение «константа», а не «константы», поскольку первое имеет официальное определение на языке C и дает понять, что сложные выражения могут удовлетворять требованиям, если их составляющие компоненты достаточно постоянны. 26.05.2011

  • 2

    a не является постоянным выражением. Это переменная с квалификацией const. Если вам нужно символьное имя, которое можно использовать в постоянных выражениях, вам понадобится макрос препроцессора (#define a 0) или перечисление (enum { a = 0 };).

    25.05.2011
  • В качестве примечания - в C ++ это отличается, что позволяет вам использовать const квалифицированные целочисленные переменные, инициализированные константными выражениями в других константных выражениях. 26.05.2011
  • Отмеченный. В Java и C # это тоже по-другому? А как насчет Python? Или шепелявить? ;-) 26.05.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..