Содержание
- Ошибки компилятора с C2000 по C2099
- ошибка компиляции C2099: инициализатор не является константой [дубликат]
- 2 ответы
- инициализатор не является константой, ошибка C2099 при компиляции модуля, написанного на c для python
- 2 ответа
- Ошибка «элемент инициализатора не является константой» при попытке инициализировать переменную с помощью const
- ошибка C2099: инициализатор не является константой и предупреждением C4013: «гамма» не определена; предполагая, что extern возвращает int
- 4 ответа
Ошибки компилятора с C2000 по C2099
В статьях в этом разделе документации объясняется подмножество сообщений об ошибках, создаваемых компилятором.
Компиляторы и средства сборки Visual Studio могут сообщать о различных типах ошибок и предупреждений. После обнаружения ошибки или предупреждения средства сборки могут делать предположения о намерении кода и пытаться продолжить работу, чтобы можно было сообщать о дополнительных проблемах одновременно. Если средства делают неверное предположение, последующие ошибки или предупреждения не могут применяться к проекту. При устранении проблем в проекте всегда начинайте с первой зарегистрированной ошибки (или предупреждения) и выполняйте повторную сборку как можно чаще. Одно исправление может привести к возникновению многих последующих ошибок.
Чтобы получить справку о конкретном диагностическом сообщении в Visual Studio, выберите его в окне вывода и нажмите клавишу F1 . Visual Studio открывает страницу документации для этой ошибки, если она существует. Вы также можете использовать средство поиска в верхней части страницы, чтобы найти статьи о конкретных ошибках или предупреждениях. Кроме того, просмотрите список ошибок и предупреждений по инструменту и введите оглавление на этой странице.
Не все ошибки или предупреждения Visual Studio описаны. Во многих случаях диагностическое сообщение предоставляет все доступные сведения. Если вы приземлились на этой странице при использовании F1 и считаете, что сообщение об ошибке или предупреждении требует дополнительного объяснения, сообщите нам об этом. Кнопки обратной связи на этой странице можно использовать для создания проблемы с документацией на сайте GitHub. Если вы считаете, что ошибка или предупреждение неправы или обнаружена другая проблема с набором инструментов, сообщите о проблеме с продуктом на сайте Сообщество разработчиков. Вы также можете отправить отзыв и ввести ошибки в интегрированной среде разработки. В Visual Studio перейдите в строку меню и выберите «Отправить > отзыв справки>» или отправьте предложение с помощью отправки > отзывов > справки.
Вы можете найти дополнительную помощь по ошибкам и предупреждениям на форумах Microsoft Learn Q&A . Или найдите номер ошибки или предупреждения на сайте Сообщество разработчиков Visual Studio C++. Вы также можете выполнить поиск решений в Stack Overflow .
Ссылки на дополнительные справочные материалы и ресурсы сообщества см. в справке и сообществе Visual C++.
Источник
ошибка компиляции C2099: инициализатор не является константой [дубликат]
Следующий код не компилируется:
Это сокращенный пример того, что я действительно пытаюсь сделать, но что я делаю не так?
задан 25 мая ’11, 18:05
Вы пробовали скомпилировать это в отдельный проект? По мне, выглядит идеально. — Kiril Kirov
2 ответы
В версии C89 / 90 языка C все агрегатные инициализаторы должны состоять из постоянная Только. В терминологии языка C a постоянная of int type — буквальное значение, например 10 , 20u , 0x1 и т.д. Члены перечисления также являются константами. Переменные const int тип не константы в C. Вы не можете использовать const int переменная в агрегатном инициализаторе. (По этой причине на языке C, когда вам нужно объявить именованную константу, вы должны использовать либо #define or enum , Но не const квалификатор.)
В C99 это требование для агрегатных инициализаторов было ослаблено. Теперь можно использовать неконстанты в агрегатных инициализаторах локальных объектов. Однако для статических объектов (как в вашем примере) требование все еще сохраняется. Итак, даже в C99 вам придется либо использовать
или используйте именованную константу перечисления, как предложено в ответе @R .
ответ дан 25 мая ’11, 23:05
+1, более полный, чем мой ответ, даже если немного отклонен на несколько пунктов. Возможно, вы захотите использовать фразу «постоянное выражение», а не «константы», поскольку первое имеет официальное определение на языке C и дает понять, что сложные выражения могут удовлетворять требованию, если их составляющие компоненты «в достаточной степени» постоянный». — R .. GitHub ОСТАНОВИТЬ ПОМОЩЬ ICE
a не является постоянным выражением. Это const -квалифицированная переменная. Если вам нужно символьное имя, которое можно использовать в постоянных выражениях, вам понадобится либо макрос препроцессора ( #define a 0 ) или перечисление ( enum < a = 0 >; ).
Источник
инициализатор не является константой, ошибка C2099 при компиляции модуля, написанного на c для python
Я попытался скомпилировать модуль python под названием distance с помощью c «установки python. py install —with-c «с использованием msvc 2017 в Windows 10, я получил эту ошибку,
Distance / distance.c (647): ошибка C2099: инициализатор не является константой
Distance / distance.c (689): ошибка C2099: инициализатор не является константой
Ошибка: команда ‘C: Program Files (x86) Microsoft Visual Studio 2017 BuildTools VC Tools MSVC 14.10.25017 bin HostX64 x64 cl .exe’ завершилась неудачно со статусом выхода 2
Вот код в строке 647
В строке 689 — другая подобная структура,
Оба упомянуты ниже, на одной странице
2 ответа
Я нашел решение, посмотрев определение структуры PyTypeObject PyTypeObject, я изменил yVarObject_HEAD_INIT(&PyType_Type, 0) на PyVarObject_HEAD_INIT(NULL, 0) , и он успешно компилируется, и я пробовал некоторые функции, и он работает, поэтому ошибка вызвана &PyType_Type , который является PyObject* , я знаю, что, поскольку IFastComp_Type является глобальным varailble, он должен быть инициализирован константой, но я все еще не знаю, почему автор модуля привел &PyType_Type в качестве аргумента, спасибо всем за ваши комментарии.
Эта линия немного похожа на бородавку; мы хотели бы написать:
поскольку тип объекта типа — «тип», но это не совсем соответствует C, и некоторые компиляторы жалуются. К счастью, этот член будет заменен для нас PyType_Ready() .
Я предполагаю, что Visual C — это компилятор, который жалуется, и модуль был написан и протестирован с помощью GCC .
Источник
Ошибка «элемент инициализатора не является константой» при попытке инициализировать переменную с помощью const
Я получаю сообщение об ошибке в строке 6 (инициализируйте my_foo как foo_init) следующей программы, и я не уверен, что понимаю, почему.
Имейте в виду, что это упрощенная версия большого многофайлового проекта, над которым я работаю. Цель заключалась в том, чтобы иметь одну константу в объектном файле, которую несколько файлов могли бы использовать для инициализации структуры состояния. Поскольку это встроенная цель с ограниченными ресурсами, а структура не такая уж маленькая, мне не нужны множественные копии источника. Я бы предпочел не использовать:
Я также пытаюсь написать переносимый код, поэтому мне нужно решение, подходящее для C89 или C99.
Связано ли это с ORG в объектном файле? Что инициализированные переменные входят в одну ORG и инициализируются путем копирования содержимого второй ORG?
Может быть, мне просто нужно изменить свою тактику и сделать так, чтобы функция инициализации делала все копии при запуске. Разве есть другие идеи?
В языке C объекты со статической продолжительностью хранения должны быть инициализированы константными выражениями или агрегатными инициализаторами, содержащими константные выражения.
«Большой» объект никогда не является постоянным выражением в C, даже если объект объявлен как const .
Кроме того, в языке C, термин «константа» относится к буквенным константам (как 1 , ‘a’ , 0xFF и так далее), членам перечислений, и результатам таких операторов , как sizeof . Константные объекты (любого типа) не являются константами в терминологии языка C. Их нельзя использовать в инициализаторах объектов со статической продолжительностью хранения, независимо от их типа.
Например, это НЕ константа
Вышеупомянутое N будет константой в C ++, но не константой в C. Итак, если вы попытаетесь сделать
вы получите ту же ошибку: попытка инициализировать статический объект непостоянным.
По этой причине в языке C мы преимущественно используем #define для объявления именованных констант, а также прибегаем #define к созданию именованных агрегатных инициализаторов.
Источник
ошибка C2099: инициализатор не является константой и предупреждением C4013: «гамма» не определена; предполагая, что extern возвращает int
Я пытаюсь использовать дерево R с открытым исходным кодом, но получаю ошибки. Я потратил несколько часов, чтобы исправить это, но не смог. Пожалуйста помоги. Часть кода выглядит следующим образом:
Я получаю следующие ошибки: 1>c:usersuserdesktoprgammavol.c(14): ошибка C2099: инициализатор не является константой 1>c:usersuserdesktoprgammavol.c (21): предупреждение C4013: «гамма» не определена; предполагая, что extern возвращает int
Строка 14 — const double log_pi = log(M_PI); строка 21: log_gamma = gamma(dimension/2.0 + 1);
4 ответа
Два сообщения об ошибках вполне понятны.
Первый говорит о том, что вы не можете инициализировать переменную непостоянным значением.
Хотя log(M_PI) действительно является константой, компилятор не может рассматривать ее как таковую, потому что он не знает, всегда ли функция log() возвращает один и тот же результат. Это так, но компилятор должен предполагать, что это не так, следовательно, «непостоянный».
Второй говорит, что функция gamma , которую вы пытаетесь здесь вызвать, не определена.
Следовательно, предполагается, что это extern int gamma() . Поскольку неясно, где объявлена эта функция, вы должны по крайней мере включить соответствующий заголовочный файл, содержащий ее прототип.
Эта строка является причиной вашей первой ошибки:
Выражение log(M_PI) не является константой и не может использоваться при инициализации. Либо используйте следующее, либо переместите определение внутрь функции main и удалите const :
Вторая ошибка связана с тем, что компилятор не может найти функцию gamma . Кажется, что он не определен в вашем math.h . Если вы не получаете ошибок компоновщика, я предлагаю вам добавить:
Правильным было бы найти правильный заголовочный файл для включения. Этот вопрос может пролить свет.
Статическая константа должна быть инициализирована во время компиляции, вы помещаете туда вызов функции. Продвинутые компиляторы, такие как gcc, в любом случае могут вычислить что-то подобное во время компиляции и просто предупредят о недопустимой конструкции вместо того, чтобы выдать ошибку. Ваш видимо на это не способен.
Другое дело, что gamma() не является стандартной функцией libmath, это некоторая нестандартная вещь Unix, которую вы найдете в BSD и Linux, но не (судя по вашим путям) в вашей Windows. В любом случае он устарел, и есть tgamma() и lgamma() , которые стандартизированы в C99.
log(M_PI) не является константным выражением, это константный квалифицированный объект, который не является константой в терминологии языка C. Для этого вам нужно объявить именованную константу, которую вы должны использовать либо #define , либо enum , но не квалификатор const . Переменные типа const double не являются константами в C.
Источник
proc_db.h
C | ||
|
proc_db.c
C | ||
|
procedure.c
C | ||
|
Выдает такую ошибку: 1>c:usersандрейdocumentsvisual studio 2010projectsproject_database_labproject_databas e_labproc_db.c(6): error C2059: синтаксическая ошибка: if
Добавлено через 1 минуту
а если писать вот так:
C | ||
|
то пишет error c2099 инициализация не явл. константой
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
- Remove From My Forums
-
Question
-
Compiler: Microsoft Visual C++ 2010 Express, SP1
Project Property: C/C++ Advance Compile As: Compile as C Code (/TC)Message:
error C2099: initializer is not a constant
Simple Test Case Showing Error:
typedef struct
{
char *stringP;
int lino;
} foo_t;
#define bad {static foo_t foo ={__FILE__,__LINE__};}
#define good {static foo_t foo ={«filename»,10};}
int main()
{
bad; // error C2099: initializer is not a constant
good; // no error
return 0;
}—————————————————————————-
This generates a `C2099` error. This code compiles & links correctly under gcc but not Visual C++ 2010 Express (compile as C Code — i.e. /TC option).
Answers
-
Try this workaround:
#define bad { static foo_t foo = { __FILE__ }; foo.lino = __LINE__; }Or switch to C++.
-
Marked as answer by
Thursday, March 31, 2011 7:33 AM
-
Marked as answer by
-
Hi Bob,
Based on my knowledge, I think you have an issue about Macro definition.
error C2099: initializer is not a constant
It means that you should use a constant to initialize this character.
#define bad {static foo_t foo ={__FILE__,__LINE__};}
It is a macro definition which has predefined a static strut.
__LINE__ returns line number. When the codes application is initialized and run the macro definition , __LINE__ is 7. However,
when the application go to main function , __LINE__ has been changed to 13. So, __LINE__ is not a constant.
I hope my suggestion can help you to solve your issue. If anything is clear, please feel free and let me know.
Best Regards,
Rob
Rob Pan [MSFT]
MSDN Community Support | Feedback to us
Get or Request Code Sample from Microsoft
Please remember to mark the replies as answers if they help and unmark them if they provide no help.-
Marked as answer by
Rob Pan
Thursday, March 31, 2011 7:33 AM
-
Marked as answer by
- Remove From My Forums
-
Question
-
Compiler: Microsoft Visual C++ 2010 Express, SP1
Project Property: C/C++ Advance Compile As: Compile as C Code (/TC)Message:
error C2099: initializer is not a constant
Simple Test Case Showing Error:
typedef struct
{
char *stringP;
int lino;
} foo_t;
#define bad {static foo_t foo ={__FILE__,__LINE__};}
#define good {static foo_t foo ={«filename»,10};}
int main()
{
bad; // error C2099: initializer is not a constant
good; // no error
return 0;
}—————————————————————————-
This generates a `C2099` error. This code compiles & links correctly under gcc but not Visual C++ 2010 Express (compile as C Code — i.e. /TC option).
Answers
-
Try this workaround:
#define bad { static foo_t foo = { __FILE__ }; foo.lino = __LINE__; }Or switch to C++.
-
Marked as answer by
Thursday, March 31, 2011 7:33 AM
-
Marked as answer by
-
Hi Bob,
Based on my knowledge, I think you have an issue about Macro definition.
error C2099: initializer is not a constant
It means that you should use a constant to initialize this character.
#define bad {static foo_t foo ={__FILE__,__LINE__};}
It is a macro definition which has predefined a static strut.
__LINE__ returns line number. When the codes application is initialized and run the macro definition , __LINE__ is 7. However,
when the application go to main function , __LINE__ has been changed to 13. So, __LINE__ is not a constant.
I hope my suggestion can help you to solve your issue. If anything is clear, please feel free and let me know.
Best Regards,
Rob
Rob Pan [MSFT]
MSDN Community Support | Feedback to us
Get or Request Code Sample from Microsoft
Please remember to mark the replies as answers if they help and unmark them if they provide no help.-
Marked as answer by
Rob Pan
Thursday, March 31, 2011 7:33 AM
-
Marked as answer by
- Remove From My Forums
-
Question
-
Hi the code below fails to compile in release mode (as a C file, .cpp is ok) with the above error. Strangely it only fails on the «floor» definition, not the «ceil» one. But both floor() and ceil() seem to be declared in exactly the same way.
Desperately need this to be able to compile a 3rd party library that I rely on.// floor.c : Defines the entry point for the console application.
//#include
«stdafx.h»
#include
<math.h>
double
(__cdecl *pFloor)( double) = floor;
double (__cdecl *pCeil)( double) = ceil;int
_tmain(int argc, _TCHAR* argv[])
{
return 0;
}Compile options are:
/O2 /Oi /GL /D «WIN32» /D «NDEBUG» /D «_CONSOLE» /D «_UNICODE» /D «UNICODE» /FD /EHsc /MD /Gy /Fo»Release\» /Fd»Releasevc90.pdb» /W3 /nologo /c /Zi /TP /errorReport:prompt
Compiler is VS 2008, SP1
Any ideas?
Answers
-
Add this statement before function pointers:
#pragma function (floor)
-
Marked as answer by
Wednesday, October 21, 2009 11:07 AM
-
Marked as answer by
-
Quote>Couldn’t reproduce.
You changed the example. The error occurs if the declaration *and initialization*
occur at global scope. You made them local.The error also goes away if the function pointers are declared globally
*without initialization* and then assigned their values:#include «stdafx.h»
#include <math.h>
double(__cdecl *pFloor)( double);
double (__cdecl *pCeil)( double);int _tmain(int argc, _TCHAR* argv[])
{
pFloor = floor;
pCeil = ceil;
return 0;
}— Wayne
-
Marked as answer by
Rong-Chun Zhang
Thursday, October 22, 2009 8:16 AM
-
Marked as answer by