213 / 202 / 85
Регистрация: 09.05.2012
Сообщений: 494
|
||||||||||||||||
1 | ||||||||||||||||
Ошибка компиляции "initializer element is not constant"23.09.2013, 18:40. Показов 13768. Ответов 36
Метки нет (Все метки)
Здравствуйте. Наткнулся(ладно, каюсь - сам написал) на вот такой код:
0
|
23.09.2013, 18:40 | |
Ответы с готовыми решениями:
36
Initializer element is not constant Ошибка компиляции "assigning to an array from an initializer list" Ошибка "expected ‘;’, ‘,’ or ‘)’ before numeric constant" при компиляции кода Ошибка при компиляции invalid suffix "i64" on integer constant Ошибка: Specified element is already the logical child of another element. Disconnect it first. |
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
|
24.09.2013, 12:56 | 22 |
Есть одна оговорка int a = 1 ? 123 : (foo() + x) / y;
Немного похоже на формальные требования к обработчикам прерываний (запрет на изменение любых статических данных за исключением sig_atomic_t в том числе и по озвученным Вами причинам).
0
|
24.09.2013, 13:01 | 23 |
Ни в C89, ни в C99 так нельзя писать. Можно в GNU C, но его считать за стандарт нельзя. От версии к версии у них политика партии постоянно меняется
Добавлено через 1 минуту Нет, что-то в голове вертится именно про разницу между статическим и динамическим инициализаторами (вызовут прерывание или не вызовут). Прерывания являются частью стандартов плавающих чисел
0
|
833 / 641 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
|
|
24.09.2013, 13:56 | 25 |
0
|
24.09.2013, 14:05 | 26 |
Хм... тот компилятор, которым пользуемся мы, такое запрещает. gcc разрешает. Пойду-ка поищу icc, где-то он у нас был
Добавлено через 7 минут "%lf" в стандарте нету: http://www.cplusplus.com/reference/cstdio/printf/ Хотя gcc его жрёт и не ругается (а он умеет ругаться по опции -Wformat на неправильные аргументы printf'а). В glibc'шном man'е по printf'у ничего не нашёл про %lf. По-моему, %f=float и %lf=double - это от scanf'а. И, видимо, для симметрии %lf перетащили в printf float в printf невозможно передать, т.к. он в момент передачи превращается в double (по правилам promotion'а в языке Си). Добавлено через 41 секунду При смене Float на double программа выдает нули
0
|
833 / 641 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
|
|
24.09.2013, 16:31 | 27 |
Ссылочку на описание для Си, а не Си++ можно?
Добавлено через 33 секунды Я знаю.
0
|
24.09.2013, 16:40 | 29 |
Всё, что в Си++ начинается из инклюдов на букву c (в данном случае cstdio) - это утащено из стандарта Си. Есть ли в подобном виде где-то в инете - не знаю. В стандарте - ISO/IEC 9899:1999 раздел "7.19.6.1 The fprintf function" пункт 7. Там написано то же самое, что и по ссылке
Добавлено через 2 минуты Тоже запрещает. Если я правильно понимаю написанное в стандарте, то это косяк компилятора. Попробуем написать в edg (авторы фронтенда, который используется в icc) Код
$ icc -v Version 8.0 $ icc t.c -std=c99 t.c(4): error: function call is not allowed in a constant expression int a = 1 ? 123 : (foo() + x) / y; ^ t.c(4): error: expression must have a constant value int a = 1 ? 123 : (foo() + x) / y; ^ t.c(4): error: expression must have a constant value int a = 1 ? 123 : (foo() + x) / y; ^
1
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
|
24.09.2013, 16:51 | 30 |
Вопрос целесообразности. ИМХО никто в здравом уме и памяти так не пишет. Покрайней мере я в реальном коде не встречал не разу. А с другой стороны, раз можно, то почему бы и нет
PS: добрался до компилятора, gcc и clang кушают.
0
|
24.09.2013, 16:56 | 31 |
Ну если в стандарте есть, значит компилятор должен такое понимать. В любом случае авторы, думается, заинтересованы в том, чтобы их фронтенд строго соответствовал стандарту.
На gcc в таких вопросах я очень не люблю смотреть, потому что у них в принципе нету "чистой" поддержки какого-нибудь языка, везде просачиваются их собственные расширения, а потому дальше начинается гадание, мы имеем дело с фичей языка или с особенностью gcc. С clang'ом не работал, так что не знаю. Эталоном стандартов для меня всегда был Sun'овский компилятор, но чего-то мы тут толпой не сообразили, как его на C99 настроить
0
|
24.09.2013, 17:14 | 33 |
Код
$ cc t.c -xc99 -xc99=lib is not available on SunOS 5.9 Sun'овский компилятор этот тест съел в режиме c89 (в дефолтном) Добавлено через 1 минуту Нашёл icc-11.1. Там уже всё в порядке
0
|
213 / 202 / 85
Регистрация: 09.05.2012
Сообщений: 494
|
|
24.09.2013, 19:19 [ТС] | 36 |
0
|
25.09.2013, 11:59 | 37 |
0
|
25.09.2013, 11:59 | |
25.09.2013, 11:59 | |
Помогаю со студенческими работами здесь
37
Error: expected initializer before 'ip2str' при компиляции приложения Ошибка с отсутствующим initializer Ошибка: expected initializer before 'void' Ошибка: expected initializer before 'int' Ошибка: array must be initialized with a brace-enclosed initializer Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |