c — Проблема с const: требуется константное выражение
Вопрос задан
Изменён 6 лет 9 месяцев назад
Просмотрен 2k раз
Я использую VS 2010 Express, настроил ее для работы с языком С.
Для примера простейшая программа. Я объявляю массив типа char
. Хочу его размер задать через const
. Но VS это объявление не видит. В чем может быть проблема? Вот пример:
const int SIZE = 26; char alphabet[SIZE];
Пишет в ошибку, что требуется константное выражение.
- c
- visual-studio
на чистых сях делай так
#define SIZE 26
P.S. Изначально в сях не было const и inline, но вообще то потом (после срр) было добавлено (а так же объявление переменных в for и комментарии в стиле плюсов).
8
Неплохо бы написать, что за ошибка у Вас.
Посмотрел у себя
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <windows.h> #ifndef INTDEF const int SIZE = 26; char aa[SIZE]; #endif main () { #ifdef INTDEF const int SIZE = 26; char aa[SIZE]; #endif aa[1] = 'z'; } c:/Documents and Settings/avp/src/hashcode $ gcc t.c t.c:7: error: 'SIZE' redeclared as different kind of symbol c:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/windef.h:328: error: previous declaration of 'SIZE' was here t.c:8: error: variable-size type declared outside of any function c:/Documents and Settings/avp/src/hashcode $ gcc -DINTDEF t.c c:/Documents and Settings/avp/src/hashcode $
Ругань очевидна.
4
Поддерживаю alexlz. Данный приём называется «трюк с перечислением» и обсуждается в книге «Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ», Правило 2: Предпочитайте const, enum и inline использованию #define.
Это получается, что данный компилятор поддерживает только чистый С90 ? Может, есть какие-то настройки, которые включают поддержку более поздних форматов? Если нет, то берите другой компилятор, например, gcc.
1
Зарегистрируйтесь или войдите
Регистрация через Facebook
Регистрация через почту
Отправить без регистрации
Почта
Необходима, но никому не показывается
Отправить без регистрации
Почта
Необходима, но никому не показывается
Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки
Дважды два — Объявления
Главная
Объявления
Вакансии
Вакансии
Фильтры
ОФИЦИАНТ
Благовещенск, полный рабочий день, опыт: не важно
ОФИЦИАНТ Требования: грамотная речь, пунктуальность, чистоплотность, знание правил ресторанного сервиса. …
32000 ₽
в месяц
сегодня, 08:56
Ведущий документовед, менеджер соц. проектов
ГКУ АО «АППАРАТ ОБЩЕСТВЕННОЙ ПАЛАТЫ АМУРСКОЙ ОБЛАСТИ»
Благовещенск, полный рабочий день, опыт: не важно
В Аппарат Общественной палаты Амурской области (ресурсный центр поддержки НКО) требуется…
25000 ₽
в месяц
1 февраля
Разнорабочий
Благовещенск, полный рабочий день, опыт: не важно
Для совместного ведения личного подсобного хозяйства приглашаются люди, возможно семейная пара, можно с…
15000 ₽
в месяц
30 января
водитель автобуса
Благовещенск, полный рабочий день, опыт: от 1 до 3 лет
На постоянную работу требуется водитель автобуса. Требования: право на управление автобусом категории Д,…
30000 ₽
в месяц
30 января
архиариус
Благовещенск, неполный рабочий день, опыт: от 1 до 3 лет
В образовательное учреждение требуется архивариус на 0,5 ставки. среднее профессиональное образование, опыт…
10000 ₽
в месяц
30 января
педагог-организатор
Благовещенск, полный рабочий день, опыт: от 1 до 3 лет
на период отпуска по уходу за ребёнком требуется педагог-организатор. Требования: высшее образование по…
30000 ₽
в месяц
30 января
уборщик производственных и служебных помещений
Благовещенск, полный рабочий день, опыт: не важно
На постоянную работу требуется уборщик производственных и служебных помещений в учебный…
24471 ₽
в месяц
30 января
водитель автомобиля
Благовещенск, полный рабочий день, опыт: от 1 до 3 лет
Требования: среднее образование, право на управление автомобилем категории В,С, опыт работы не менее 5…
30000 ₽
в месяц
30 января
старший методист
Благовещенск, полный рабочий день, опыт: от 1 до 3 лет
Требования: высшее педагогическое образование, опыт работы в должности методиста образовательного…
30000 ₽
в месяц
30 января
заместитель директора по экономическим вопросам — начальник финансово-экономического отдела
Благовещенск, полный рабочий день, опыт: от 3 до 6 лет
Требования: высшее образование по направлению деятельности, стаж финансово-бухгалтерской работы, в ом числе…
70000 ₽
в месяц
30 января
ведущий документовед
Благовещенск, полный рабочий день, опыт: от 1 до 3 лет
Требования: высшее или среднее профессиональное образование, опыт работы по документационному и…
30000 ₽
в месяц
30 января
Требуется монтажник сетей связи и видеонаблюдения
Благовещенск, полный рабочий день, опыт: от 1 до 3 лет
Обязанности: — Выполнять работы по прокладке линий связи; установка камер видеонаблюдения, антивандальных…
45000 ₽
в месяц
30 января
Требуется администратор
Благовещенск, сменный график, опыт: не важно
Требуется администратор в сауну. График работы: сутки через двое. Требования, чистоплотность, порядочность,…
20000 ₽
в месяц
25 января
Требуются курьеры
Благовещенск, временная работа, опыт: не важно
Требуются курьеры. Оплата сдельная. Гибкий рабочий…
1500 ₽
за смену
25 января
продавец-консультант
Благовещенск, сменный график, опыт: не важно
На постоянную работу в торговую компанию требуется ПРОДАВЕЦ-КОНСУЛЬТАНТ (ответственный, опыт работы…
30000 ₽
в месяц
25 января
уборщик производственных помещений
Благовещенск, неполный рабочий день, опыт: от 1 до 3 лет
Обязанности: Уборка производственных помещений (офисное здание) Требования: Аккуратность,…
15000 ₽
в месяц
24 января
Специалист по недвижимости
Благовещенск, гибкий график, опыт: не важно
В федеральную компанию «Этажи» в связи с расширением команды требуется специалист по недвижимости. Мы…
90000 ₽
в месяц
23 января
Уборщик служебных помещений
ГАУКАО «АМУРСКАЯ ОБЛАСТНАЯ ФИЛАРМОНИЯ»
Благовещенск, полный рабочий день, опыт: не важно
Требуется уборщик служебных помещений.
22000 ₽
в месяц
23 января
охранник
Благовещенск, полный рабочий день, опыт: не важно
На постоянную работу в магазин требуется ОХРАННИК. График 2*2, с 10.00 до 21.00 часа. Обращаться по…
23000 ₽
в месяц
23 января
кладовщик
Благовещенск, полный рабочий день, опыт: не важно
На постоянную работу требуется КЛАДОВЩИК. (Бытовая химия, косметика, парфюмерия).…
35000 ₽
в месяц
23 января
Показать еще
Размещение объявления переменной в языке C
Как уже отмечалось, существуют две точки зрения на этот счет.
1) Объявить все в верхней части функций, потому что год 1987.
2) Объявить ближайший к первому использованию и в наименьшем возможном объеме.
Мой ответ: СДЕЛАЙТЕ ОБЕ! Поясню:
Для длинных функций 1) очень усложняет рефакторинг. Если вы работаете в кодовой базе, где разработчики против идеи подпрограмм, тогда у вас будет 50 объявлений переменных в начале функции, и некоторые из них могут быть просто «i» для цикла for, который находится в самом начале.
Поэтому я разработал декларацию-на-верху-ПТСР из этого и попытался сделать вариант 2) неукоснительно.
Я вернулся к первому варианту по одной причине: короткие функции. Если ваши функции достаточно короткие, то у вас будет мало локальных переменных, а так как функция короткая, то, если вы поместите их вверху функции, они все равно будут близки к первому использованию.
Кроме того, анти-шаблон «объявить и установить в NULL», когда вы хотите объявить вверху, но не сделали некоторых вычислений, необходимых для инициализации, разрешается, потому что вещи, которые вам нужно инициализировать, скорее всего, будут получены в качестве аргументов .
Теперь я думаю, что вы должны объявить в начале функций и как можно ближе к первому использованию. Так что ОБА! И способ сделать это с хорошо разделенными подпрограммами.
Но если вы работаете над длинной функцией, поместите вещи ближе всего к первому использованию, потому что так будет легче извлекать методы.
Мой рецепт таков. Для всех локальных переменных возьмите переменную и переместите ее объявление вниз, скомпилируйте, а затем переместите объявление непосредственно перед ошибкой компиляции. Это первое использование. Сделайте это для всех локальных переменных.
целое число = 0; <код, который использует foo> инт бар = 1; <код, который использует панель> <код, который использует foo>
Теперь определите блок области, который начинается перед объявлением, и переместите конец, пока программа не скомпилируется
{ интервал foo = 0; <код, который использует foo> } инт бар = 1; <код, который использует панель> >>> Здесь первая ошибка компиляции <код, который использует foo>
Это не компилируется, потому что есть еще код, использующий foo. Мы можем заметить, что компилятор смог пройти через код, который использует bar, потому что он не использует foo. На данный момент есть два варианта. Механический — просто перемещать «}» вниз до тех пор, пока он не скомпилируется, а другой вариант — проверить код и определить, можно ли изменить порядок на:
{ интервал foo = 0; <код, который использует foo> } <код, который использует foo> инт бар = 1; <код, который использует панель>
Если порядок может быть изменен, это, вероятно, то, что вам нужно, поскольку это сокращает срок службы временных значений.
Еще одно замечание: нужно ли сохранять значение foo между блоками кода, которые его используют, или это может быть просто разное foo в обоих случаях. Например
int i; для (я = 0; я < 8; ++ я) { ... } <кое-что> для (я = 3; я < 32; ++ я) { ... }
Эти ситуации требуют большего, чем моя процедура. Разработчик должен будет проанализировать код, чтобы определить, что делать.
Но первый шаг — найти первое применение. Вы можете сделать это визуально, но иногда проще удалить объявление, попытаться скомпилировать и просто вернуть его выше первого использования. Если это первое использование находится внутри оператора if, поместите его туда и проверьте, компилируется ли оно. Затем компилятор определит другие варианты использования. Попробуйте создать блок областей, охватывающий оба варианта использования.
После того, как эта механическая часть выполнена, становится легче анализировать, где находятся данные. Если переменная используется в большом блоке области видимости, проанализируйте ситуацию и посмотрите, не используете ли вы одну и ту же переменную для двух разных вещей (например, «i», который используется для двух циклов for). Если использование не связано, создайте новые переменные для каждого из этих несвязанных применений.
§ 22.1-254.1. Декларация политики; требования к домашнему обучению детей
Составление отчета: Отметьте разделы, которые вы хотите включить в отчет, затем используйте кнопку «Создать отчет» внизу страницы, чтобы создать отчет. После создания отчета у вас будет возможность загрузить его в формате pdf, распечатать или отправить по электронной почте.
08.02.2023
A. Когда требования этого раздела выполнены, обучение детей их родителями является приемлемой альтернативной формой образования в соответствии с политикой Содружества Вирджинии. Любой родитель любого ребенка, которому исполнится пять лет не позднее 30 сентября любого учебного года и которому еще не исполнилось восемнадцати лет, может выбрать домашнее обучение вместо посещения школы, если он (i) имеет аттестат о среднем образовании. ; (ii) является учителем квалификации, установленной Советом; (iii) предоставляет ребенку программу обучения или учебный план, который может осуществляться в рамках заочного курса или программы дистанционного обучения или любым другим способом; или (iv) предоставляет доказательства того, что он в состоянии обеспечить надлежащее образование для ребенка.
B. Любой родитель, решивший проводить домашнее обучение вместо посещения школы, должен ежегодно в августе уведомлять начальника отделения о своем намерении обучать ребенка таким образом и предоставлять описание учебной программы, ограниченное списком предметов, подлежащих изучению. в течение следующего года, а также подтверждение того, что они отвечают одному из критериев для проведения домашнего обучения, как того требует подраздел A. Родители, решившие проводить домашнее обучение, должны ежегодно уведомлять об этом не позднее 15 августа. Любой родитель, который переезжает в школьное подразделение или начинает домашнее обучение после начала учебного года, должен уведомить начальника отделения о своем намерении провести домашнее обучение как можно скорее и после этого должен выполнить требования настоящего раздела в течение 30 дней с момента такого уведомления. Суперинтендант отделения должен уведомить суперинтенданта о количестве учащихся в школьном отделении, получающих домашнее обучение.
C. Родитель, выбравший домашнее обучение, должен до 1 августа, следующего за учебным годом, в котором ребенок получил домашнее обучение, предоставить начальнику отделения либо (i) подтверждение того, что ребенок набрал совокупный балл не ниже среднего четвертая станция в любом национальном стандартизированном тесте успеваемости, или эквивалентный балл в тесте ACT, SAT или PSAT, или (ii) оценка или оценка, которую руководитель отделения определяет как указание на то, что ребенок достигает адекватного уровня образовательного роста и прогресс, включая (a) оценочное письмо от лица, имеющего лицензию на преподавание в любом штате, или лица со степенью магистра или выше в академической дисциплине, обладающего информацией об академическом прогрессе ребенка, в котором говорится, что ребенок достигает надлежащего уровня образовательного роста и прогресса или (b) табель успеваемости или выписка из высшего учебного заведения, программы дистанционного обучения в колледже или домашнего обучения заочная школа.
В случае, если родитель не предоставит подтверждение прогресса, как требуется в этом подразделе, программа домашнего обучения для этого ребенка может быть помещена на испытательный срок в течение одного года. Родители должны предоставить суперинтенданту подразделения подтверждение своей способности обеспечить надлежащее образование для своего ребенка в соответствии с подразделом А и план исправления на испытательный год, который указывает, что их программа предназначена для устранения любых пробелов в образовании. После принятия таких доказательств и плана суперинтендантом отделения домашнее обучение может продолжаться в течение одного испытательного года. Если план исправления и доказательства не будут приняты или требуемые доказательства прогресса не будут предоставлены до 1 августа после испытательного года, домашнее обучение прекращается, и родитель должен принять другие меры для обучения ребенка, соответствующие § 22.1-254. . Требования настоящей части не распространяются на детей, которым на 30 сентября учебного года не исполнилось шести лет.
D. Ничто в этом разделе не запрещает учащемуся и его родителям получать оправдание от посещения школы по причине добросовестного религиозного образования или убеждений в соответствии с подразделом B 1 § 22.1-254.
E. Любая сторона, недовольная решением начальника отдела, может обжаловать его решение в течение 30 дней у независимого должностного лица, проводящего слушания. Независимый судебный пристав-исполнитель выбирается из списка, который составляется Исполнительным секретарем Верховного суда для рассмотрения апелляций о размещении детей-инвалидов. Расходы на слушание распределяются между сторонами должностным лицом, проводящим слушание, в порядке, соответствующем его выводам.
F. Школьные советы должны предоставить учащимся, проходящим домашнее обучение, экзамены Advanced Placement (AP), Preliminary SAT/National Merit Scholarship Qualification Test (PSAT/NMSQT) и PreACT. Школьные советы должны принять письменные правила, определяющие дату, до которой такие учащиеся должны зарегистрироваться для участия в таких экзаменах. Школьные советы уведомляют таких учащихся и их родителей о таком крайнем сроке регистрации и о наличии финансовой помощи малообеспеченным и нуждающимся учащимся для сдачи таких экзаменов.
G. Ни один суперинтендант отделения или местный школьный совет не должны раскрывать Департаменту или любому другому физическому или юридическому лицу за пределами местного школьного отделения информацию, предоставленную родителем или учащимся для выполнения требований этого раздела или подраздела B 1 § 22.1-254. Однако суперинтендант отделения или местный школьный совет могут раскрыть с письменного согласия родителей учащегося такую информацию в той мере, в какой это предусмотрено согласием родителей. Ничто в этом подразделе не запрещает суперинтенданту отделения уведомлять суперинтенданта о количестве учащихся в школьном отделении, получающих домашнее обучение, как того требует подраздел B.
1984 г., гр. 436; 1986, с. 215; 1991, с. 306; 1992, с. 131; 1993, с. 992; 1994, с. 854; 1998, с.