Необъявленный идентификатор как исправить

Что такое необъявленные ошибки идентификатора? Каковы общие причины и как их исправить? Пример текстов ошибок: Для компилятора Visual Studio: error...

Что такое необъявленные ошибки идентификатора? Каковы общие причины и как их исправить?

Пример текстов ошибок:

  • Для компилятора Visual Studio: error C2065: 'cout' : undeclared identifier
  • Для компилятора GCC: 'cout' undeclared (first use in this function)

39

Решение

Чаще всего они приходят из-за того, что забывают включить заголовочный файл, содержащий объявление функции, например, эта программа выдаст ошибку «необъявленный идентификатор»:

Отсутствует заголовок

int main() {
std::cout << "Hello world!" << std::endl;
return 0;
}

Чтобы это исправить, мы должны включить заголовок:

#include <iostream>
int main() {
std::cout << "Hello world!" << std::endl;
return 0;
}

Если вы написали заголовок и включили его правильно, заголовок может содержать неправильный включить охрану.

Чтобы узнать больше, смотрите http://msdn.microsoft.com/en-us/library/aa229215(v=vs.60).aspx.

Переменная с ошибкой

Другой распространенный источник ошибки новичка возникает, когда вы неправильно написали переменную:

int main() {
int aComplicatedName;
AComplicatedName = 1;  /* mind the uppercase A */
return 0;
}

Неправильный объем

Например, этот код выдаст ошибку, потому что вам нужно использовать std::string:

#include <string>

int main() {
std::string s1 = "Hello"; // Correct.
string s2 = "world"; // WRONG - would give error.
}

Использовать до объявления

void f() { g(); }
void g() { }

g не был объявлен до его первого использования. Чтобы это исправить, либо переместите определение g до f:

void g() { }
void f() { g(); }

Или добавить декларацию g до f:

void g(); // declaration
void f() { g(); }
void g() { } // definition

stdafx.h не сверху (специфично для VS)

Это зависит от Visual Studio. В VS нужно добавить #include "stdafx.h" перед любым кодом. Код до того, как он игнорируется компилятором, так что если у вас есть это:

#include <iostream>
#include "stdafx.h"

#include <iostream> будет проигнорировано Вам нужно переместить его ниже:

#include "stdafx.h"#include <iostream>

Не стесняйтесь редактировать этот ответ.

54

Другие решения

Рассмотрим похожую ситуацию в разговоре. Представьте, что ваш друг говорит вам: «Боб идет на ужин», а ты не представляешь, кто такой Боб. Вы будете в замешательстве, верно? Твой друг должен был сказать: «У меня есть коллега по работе по имени Боб. Боб подходит к обеду». Теперь Боб объявлен, и вы знаете, о ком говорит ваш друг.

Компилятор выдает ошибку «необъявленный идентификатор», когда вы пытаетесь использовать какой-то идентификатор (который будет именем функции, переменной, класса и т. Д.), И компилятор не видит объявления для него. То есть компилятор понятия не имеет, о чем вы говорите, потому что раньше его не видел.

Если вы получаете такую ​​ошибку в C или C ++, это означает, что вы не сказали компилятору о том, что вы пытаетесь использовать. Объявления часто встречаются в заголовочных файлах, поэтому, скорее всего, это означает, что вы не включили соответствующий заголовок. Конечно, может случиться так, что вы просто не помните, чтобы объявить сущность вообще.

Некоторые компиляторы выдают более конкретные ошибки в зависимости от контекста. Например, пытаясь скомпилировать X x; где тип X не был объявлен с Clang скажет вам «неизвестное имя типа X«. Это гораздо полезнее, потому что вы знаете, что он пытается интерпретировать X как тип. Тем не менее, если у вас есть int x = y;, где y еще не объявлено, он скажет вам «использование необъявленного идентификатора y«потому что есть некоторая двусмысленность в том, что именно y может представлять.

12

У меня была такая же проблема с пользовательским классом, который был определен в пространстве имен. Я пытался использовать класс без пространства имен, вызывая ошибку компилятора «идентификатор» MyClass «не определен».
Добавление

using namespace <MyNamespace>

или используя класс, как

MyNamespace::MyClass myClass;

решил проблему.

5

В C и C ++ все имена должны быть объявлены перед использованием. Если вы попытаетесь использовать имя переменной или функции, которая не была объявлена, вы получите ошибку «необъявленный идентификатор».

Однако функции — это особый случай в C (и только в C), в котором вам не нужно сначала объявлять их. Компилятор C будет предполагать, что функция существует с числом и типом аргументов, как в вызове. Если фактическое определение функции не совпадает, вы получите еще одну ошибку. Этот особый случай для функций не существует в C ++.

Вы исправляете ошибки такого рода, проверяя, что функции и переменные объявлены до их использования. В случае printf вам нужно включить заголовочный файл <stdio.h> (или же <cstdio> в C ++).

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

4

Эти сообщения об ошибках

1.For the Visual Studio compiler: error C2065: 'printf' : undeclared identifier
2.For the GCC compiler: `printf' undeclared (first use in this function)

означает, что вы используете имя printf но компилятор не видит, где было объявлено имя, и, соответственно, не знает, что это значит.

Любое имя, используемое в программе, должно быть объявлено до ее использования. Компилятор должен знать, что обозначает имя.

В этом конкретном случае компилятор не видит объявление имени printf , Как мы знаем (но не компилятор) это имя стандартной функции C, объявленной в заголовке <stdio.h> в C или в заголовке <cstdio> в C ++ и размещены в стандарте (std::) и глобальный (::) (не обязательно) пространства имен.

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

Например
C:

#include <stdio.h>

int main( void )
{
printf( "Hello Worldn" );
}

C ++:

#include <cstdio>

int main()
{
std::printf( "Hello Worldn" );
// or printf( "Hello Worldn" );
// or ::printf( "Hello Worldn" );
}

Иногда причиной такой ошибки является простая опечатка. Например, давайте предположим, что вы определили функцию PrintHello

void PrintHello()
{
std::printf( "Hello Worldn" );
}

но в основном вы сделали опечатку и вместо PrintHello ты напечатал printHello с строчной буквы «р».

#include <cstdio>

void PrintHello()
{
std::printf( "Hello Worldn" );
}

int main()
{
printHello();
}

В этом случае компилятор выдаст такую ​​ошибку, потому что он не видит объявление имени printHello, PrintHello а также printHello два разных имени, одно из которых было объявлено, а другое не объявлено, но используется в теле основного

3

Это похоже на использование функции без ее объявления. заголовочный файл будет содержать
функция printf (). Включите заголовочный файл в вашу программу, это решение для этого.
Некоторые пользовательские функции могут также вызывать ошибки, если они не были объявлены перед использованием. Если
это используется во всем мире без проб.

0

В большинстве случаев, если вы уверены, что импортировали данную библиотеку, Visual Studio поможет вам с IntelliSense.

Вот что сработало для меня:

Удостоверься что #include "stdafx.h" объявляется первым, то есть вверху всех ваших включений.

0

Когда программирую на C++ в Visual Studio, появляется ошибка в операторах сout и cin. Компилятор пишет, что эти операторы не объявлены (undeclared identifier). Подскажите, пожалуйста, что делать?

Добавлено.

Все равно ничего не получается

#include <iostream>
#include "stdafx.h"
#include <cmath>
using namespace std;
int main(){
    //объявление переменной:
    double V,T,alpha;
    //грави постоянная:
    const double g=9.8;
    //Ввод параметров:
    cout<<"V = ";-здесь выводит ошибку
    cin>>V;-и здесь
    cout<<"T = ";
    cin >>T;
    alpha = asin(g*T/2*V);
    cout<<"Значение угла альфа равно = "<<alpha;
    return 0;
}

Nicolas Chabanovsky's user avatar

задан 27 сен 2011 в 18:30

Саймон's user avatar

3

Поменяй местами #include <iostream> и #include "stdafx.h" ("stdafx.h" должно стоять первым).

angry's user avatar

angry

8,63717 золотых знаков72 серебряных знака180 бронзовых знаков

ответ дан 29 сен 2011 в 10:50

Vomifort's user avatar

Во-первых, надо было приводить версию среды, т.к. в Студии 2010 работает вполне нормально. В более старых версиях надо читать внимательно сообщения построения. Так, там наверняка должно быть сообщение типа «iostream: файл пропущен при поиске файла предкомпилированных заголовков», а именно — «stdafx.h». Поставьте #include "stdafx.h" в САМОМ НАЧАЛЕ, и да будет Вам счастье.

ответ дан 29 сен 2011 в 18:56

3JIoi_Hy6's user avatar

3JIoi_Hy63JIoi_Hy6

8926 серебряных знаков13 бронзовых знаков

Для правильной работы вам надо:

  1. Подключить библиотеку iostream.
  2. Воспользоваться конструкцией using namespace std для разрешения области видимости.

Пример кода:

#include <iostream>
using namespace std;

int main() {
    cout << "Hello std!" << endl;
    return 0;
}

ответ дан 27 сен 2011 в 18:58

Nicolas Chabanovsky's user avatar

Nicolas ChabanovskyNicolas Chabanovsky

50.6k80 золотых знаков257 серебряных знаков493 бронзовых знака

1

 // Требуется создать в VS пустой проект  
#include "stdafx.h"
#include "iostream"
#include <cmath>
#include <conio.h>
using namespace std;
int main(){
setlocale(0,"russian");
//объявление переменной:
double V,T,alpha;
//грави постоянная:
const double g=9.8;
//Ввод параметров:
cout << "V="; //-здесь выводит ошибку
cin >> V; //-и здесь
cout << "T=";
cin >> T;
alpha = asin(g*T/2*V);
cout << "Значение угла альфа равно = "<<alpha;
_getch();
 }

Но лучше все это дело через std::cin и std::cout

ответ дан 29 сен 2011 в 8:11

johnfelix's user avatar

johnfelixjohnfelix

1191 серебряный знак11 бронзовых знаков

2

Ketler

0 / 0 / 0

Регистрация: 02.07.2011

Сообщений: 15

1

13.10.2011, 00:01. Показов 28730. Ответов 14

Метки нет (Все метки)


Задан исходный код лабораторной работы по программированию. Нужно модифицировать код по определенным правилам (в зависимости от варианта). Но при попытке скомпилировать в
Visual Studio 2010 выдает ошибку типа Ошибка «error C2065: cin: необъявленный идентификатор» .

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <iostream.h>
#include <stdlib.h>
#include <iomanip.h>
using namespace std;
 
struct CH
{
  int k;
  CH *ptr;
};
 
CH * aadd_stek( CH *);
CH * del_stek ( CH *);
void main()
{
  CH *beg=NULL;
  char c;
  while(1)
  {
    cout << "nn1. Добавление элемента в cтекn";
    cout << "2. Выборка элемента из стекаn";
    cout << "3. Выход из программыn";
    cout << "Ваш выбор:";
    cin >> c;
    switch(c)
    {
      case '1':
    beg=aadd_stek(beg);
    break;
      case '2':
    beg=del_stek(beg);
    break;
      case '3':
    return;
     }
   }
}
 
CH * aadd_stek( CH *first)
{
  CH *r;
  int m;
  cout << "Введите целое число=";
  cin >> m;
  // выделяем динамическую память
  r = new (CH);
  if ( r == NULL)
  {
    cerr << "Ошибка выделения динамической памятиn";
    exit(1);
  }
  // заносим в дин. память введенное число
  // и адрес вершины стека (предыдущего эл-та)
  r->k = m;
  r->ptr = first;
 
  // теперь r стал вершиной стека
  // поэтому возвращаем его из функции
  // если выполнить first = r
  // то тогда можно возвратить first
 
  return r;
}
 
CH * del_stek ( CH *first)
{
  CH *r;
  if (first == NULL)
    cout << "Стек пуст. Выбирать нечего.n";
  else
  {
    r=first;
    first = first->ptr;  // перешли на предшествующий элемент
    cout << "Из стека выбран эл-т = " << r->k << endl;
    delete r;
  }
  return first;
}

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Mut

5 / 5 / 0

Регистрация: 12.10.2011

Сообщений: 46

13.10.2011, 00:10

2

исправь

C++
1
2
3
#include <iostream.h>
#include <stdlib.h>
#include <iomanip.h>

на

C++
1
2
3
4
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <iomanip>



0



Chelioss

186 / 186 / 21

Регистрация: 08.01.2011

Сообщений: 1,139

13.10.2011, 00:13

3

Вот это

C++
1
#include "stdafx.h"

писать не надо.



0



Net_Wanderer

237 / 210 / 29

Регистрация: 08.06.2011

Сообщений: 467

13.10.2011, 00:18

4

и

C++
1
#include <cstdlib>



0



Mut

5 / 5 / 0

Регистрация: 12.10.2011

Сообщений: 46

13.10.2011, 00:19

5

моя студия без этого

C++
1
#include "stdafx.h"

ругается в стиле

C++
1
2
3
4
Ошибка    4   error C1010: непредвиденный конец
 файла во время поиска предкомпилированного заголовка.
 Возможно, вы забыли добавить директиву "#include "StdAfx.h"" в источник.
    d:программированиеоопlab11lab11anote.cpp    21



0



186 / 186 / 21

Регистрация: 08.01.2011

Сообщений: 1,139

13.10.2011, 00:22

6

Цитата
Сообщение от Mut
Посмотреть сообщение

моя студия без этого

Значит у вас что-то не так сделано.
Этот файл не требуется для этой программы.



0



237 / 210 / 29

Регистрация: 08.06.2011

Сообщений: 467

13.10.2011, 00:23

7

Цитата
Сообщение от Chelioss
Посмотреть сообщение

Значит у вас что-то не так сделано.
Этот файл не требуется для этой программы.

нужно создать «Пустой проект» а не консольный



0



Эксперт С++

5038 / 2617 / 241

Регистрация: 07.10.2009

Сообщений: 4,310

Записей в блоге: 1

14.10.2011, 10:42

8

Цитата
Сообщение от Net_Wanderer
Посмотреть сообщение

нужно создать «Пустой проект» а не консольный

Достаточно будет выключить опцию использования предкомпилируемых заголовков.



0



gooseim

Эксперт С++

516 / 420 / 92

Регистрация: 23.09.2010

Сообщений: 1,165

14.10.2011, 13:43

9

Лучше

C++
1
2
3
#include <iostream>
#include <cstdlib>
#include <iomanip>

прописать в stdafx.h и из cpp убрать
если уж используем прекомпиленные хедеры.



0



-=ЮрА=-

Заблокирован

Автор FAQ

14.10.2011, 15:20

10

Ketler, 1-й подводный камень для успешной компиляции в 2010 студии состоит в том что в ваше программе использован старый стиль заголовков

Цитата
Сообщение от Ketler
Посмотреть сообщение

#include <iostream.h>
#include <stdlib.h>
#include <iomanip.h>

Как сказал
gooseim, вам следует осуществить такую запись для подключения хедеров

C++
1
2
3
#include <iostream>
#include <cstdlib>
#include <iomanip>

Но также в вашем коде операторы ввода вывода идут без std::!
std::cout<< и std::cin>> такая запись уже не вызовет ошибок при компиляции в 2010 студии

Добавлено через 4 минуты

Цитата
Сообщение от Ketler
Посмотреть сообщение

void main()

— это тоже не кашерно для С++, странно что никто ваше внимание не это не обратил!
Ниже подправленный код

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <iostream>
#include <cstdlib>
#include <iomanip>
using namespace std;//Можно исключить, но можно и с єтой строкой
 
struct CH
{
  int k;
  CH *ptr;
};
 
CH * aadd_stek( CH *);
CH * del_stek ( CH *);
int main()
{
  CH *beg=NULL;
  char c;
  while(1)
  {
    std::cout << "nn1. Добавление элемента в cтекn";
    std::cout << "2. Выборка элемента из стекаn";
    std::cout << "3. Выход из программыn";
    std::cout << "Ваш выбор:";
    std::cin >> c;
    switch(c)
    {
      case '1':
        beg=aadd_stek(beg);
        break;
      case '2':
        beg=del_stek(beg);
        break;
      case '3':
        return;
     }
   }
  return 0;
}
 
CH * aadd_stek( CH *first)
{
  CH *r;
  int m;
  std::cout << "Введите целое число=";
  std::cin >> m;
  // выделяем динамическую память
  r = new (CH);
  if ( r == NULL)
  {
    cerr << "Ошибка выделения динамической памятиn";
    exit(1);
  }
  // заносим в дин. память введенное число
  // и адрес вершины стека (предыдущего эл-та)
  r->k = m;
  r->ptr = first;
 
  // теперь r стал вершиной стека
  // поэтому возвращаем его из функции
  // если выполнить first = r
  // то тогда можно возвратить first
 
  return r;
}
 
CH * del_stek ( CH *first)
{
  CH *r;
  if (first == NULL)
    std::cout << "Стек пуст. Выбирать нечего.n";
  else
  {
    r=first;
    first = first->ptr;  // перешли на предшествующий элемент
    std::cout << "Из стека выбран эл-т = " << r->k << endl;
    delete r;
  }
  return first;
}



1



85 / 9 / 1

Регистрация: 05.04.2010

Сообщений: 143

14.10.2011, 15:25

11

«void main()
— это тоже не кашерно для С++, странно что никто ваше внимание не это не обратил!»
это вполне логично



0



Mut

5 / 5 / 0

Регистрация: 12.10.2011

Сообщений: 46

14.10.2011, 15:29

12

C++
1
std::

можно не писать, если подключено пространство имен std
т.е.

C++
1
using namespace std;



1



-=ЮрА=-

Заблокирован

Автор FAQ

14.10.2011, 18:20

13

Mut,

Цитата
Сообщение от Mut
Посмотреть сообщение

можно не писать, если подключено пространство имен std
т.е.
Код C++
1
using namespace std;

— посмотрите скрин 2008 студии и убедитесь в обратном…

Миниатюры

Ошибка "C2065: cin: необъявленный идентификатор"
 



0



1080 / 1006 / 106

Регистрация: 28.02.2010

Сообщений: 2,889

14.10.2011, 18:22

14

-=ЮрА=-, не usig, а usi

n

g.



0



-=ЮрА=-

Заблокирован

Автор FAQ

14.10.2011, 18:40

15

Цитата
Сообщение от Евгений М.
Посмотреть сообщение

не usig, а using.

— всё увидел, на сим для себя тоже пользу извлёк уйду от докучливых std::



0



Содержание

  1. Compiler Error C2065
  2. The identifier is undeclared
  3. Example: misspelled identifier
  4. Example: use an unscoped identifier
  5. Example: precompiled header isn’t first
  6. Example: missing header file
  7. Example: missing closing quote
  8. Example: use iterator outside for loop scope
  9. Example: preprocessor removed declaration
  10. Example: C++/CLI type deduction failure
  11. Example: C++/CLI attribute parameters
  12. Ошибка C2065: ‘cout’: необъявленный идентификатор
  13. ОТВЕТЫ
  14. Ответ 1
  15. Ответ 2
  16. Ответ 3
  17. Ответ 4
  18. Ответ 5
  19. Ответ 6
  20. Ответ 7
  21. Ответ 8
  22. Ответ 9
  23. Ответ 10
  24. Ответ 11
  25. Ответ 12
  26. Ответ 13
  27. Ответ 14
  28. Ответ 15
  29. Ответ 16
  30. Ответ 17
  31. Ответ 18
  32. Ответ 19
  33. Ответ 20
  34. Ответ 21
  35. Ответ 22
  36. Ответ 23
  37. Ответ 24
  38. Что такое ошибка «необъявленный идентификатор» и как ее исправить?
  39. 8 ответов
  40. Отсутствует заголовок
  41. Неверная переменная
  42. Неверная область действия
  43. Использовать перед объявлением

Compiler Error C2065

The compiler can’t find the declaration for an identifier. There are many possible causes for this error. The most common causes of C2065 are that the identifier hasn’t been declared, the identifier is misspelled, the header where the identifier is declared isn’t included in the file, or the identifier is missing a scope qualifier, for example, cout instead of std::cout . For more information on declarations in C++, see Declarations and Definitions (C++).

Here are some common issues and solutions in greater detail.

The identifier is undeclared

If the identifier is a variable or a function name, you must declare it before it can be used. A function declaration must also include the types of its parameters before the function can be used. If the variable is declared using auto , the compiler must be able to infer the type from its initializer.

If the identifier is a member of a class or struct, or declared in a namespace, it must be qualified by the class or struct name, or the namespace name, when used outside the struct, class, or namespace scope. Alternatively, the namespace must be brought into scope by a using directive such as using namespace std; , or the member name must be brought into scope by a using declaration, such as using std::string; . Otherwise, the unqualified name is considered to be an undeclared identifier in the current scope.

If the identifier is the tag for a user-defined type, for example, a class or struct , the type of the tag must be declared before it can be used. For example, the declaration struct SomeStruct < /*. */ >; must exist before you can declare a variable SomeStruct myStruct; in your code.

If the identifier is a type alias, the type must be declared by a using declaration or typedef before it can be used. For example, you must declare using my_flags = std::ios_base::fmtflags; before you can use my_flags as a type alias for std::ios_base::fmtflags .

Example: misspelled identifier

This error commonly occurs when the identifier name is misspelled, or the identifier uses the wrong uppercase and lowercase letters. The name in the declaration must exactly match the name you use.

Example: use an unscoped identifier

This error can occur if your identifier isn’t properly scoped. If you see C2065 when you use cout , a scope issue is the cause. When C++ Standard Library functions and operators aren’t fully qualified by namespace, or you haven’t brought the std namespace into the current scope by using a using directive, the compiler can’t find them. To fix this issue, you must either fully qualify the identifier names, or specify the namespace with the using directive.

This example fails to compile because cout and endl are defined in the std namespace:

Identifiers that are declared inside of class , struct , or enum class types must also be qualified by the name of their enclosing scope when you use them outside of that scope.

This error can occur if you put any preprocessor directives, such as #include , #define , or #pragma , before the #include of a precompiled header file. If your source file uses a precompiled header file (that is, if it’s compiled by using the /Yu compiler option) then all preprocessor directives before the precompiled header file are ignored.

This example fails to compile because cout and endl are defined in the header, which is ignored because it’s included before the precompiled header file. To build this example, create all three files, then compile pch.h (some versions of Visual Studio use stdafx.cpp ), then compile C2065_pch.cpp .

The pch.h or stdafx.h source file:

Source file C2065_pch.cpp :

To fix this issue, add the #include of into the precompiled header file, or move it after the precompiled header file is included in your source file.

The error can occur if you haven’t included the header file that declares the identifier. Make sure the file that contains the declaration for the identifier is included in every source file that uses it.

Another possible cause is if you use an initializer list without including the header.

You may see this error in Windows Desktop app source files if you define VC_EXTRALEAN , WIN32_LEAN_AND_MEAN , or WIN32_EXTRA_LEAN . These preprocessor macros exclude some header files from windows.h and afxv_w32.h to speed compiles. Look in windows.h and afxv_w32.h for an up-to-date description of what’s excluded.

Example: missing closing quote

This error can occur if you’re missing a closing quote after a string constant. It’s an easy way to confuse the compiler. The missing closing quote may be several lines before the reported error location.

Example: use iterator outside for loop scope

This error can occur if you declare an iterator variable in a for loop, and then you try to use that iterator variable outside the scope of the for loop. The compiler enables the /Zc:forScope compiler option by default. For more information, see Debug iterator support.

Example: preprocessor removed declaration

This error can occur if you refer to a function or variable that is in conditionally compiled code that isn’t compiled for your current configuration. The error can also occur if you call a function in a header file that currently isn’t supported in your build environment. If certain variables or functions are only available when a particular preprocessor macro is defined, make sure the code that calls those functions can only be compiled when the same preprocessor macro is defined. This issue is easy to spot in the IDE: The declaration for the function is greyed out if the required preprocessor macros aren’t defined for the current build configuration.

Here’s an example of code that works when you build in Debug, but not Release:

Example: C++/CLI type deduction failure

This error can occur when calling a generic function, if the intended type argument can’t be deduced from the parameters used. For more information, see Generic Functions (C++/CLI).

Example: C++/CLI attribute parameters

This error can also be generated as a result of compiler conformance work that was done for Visual Studio 2005: parameter checking for Visual C++ attributes.

Источник

Ошибка C2065: ‘cout’: необъявленный идентификатор

Я работаю над частью «драйвера» моего назначения программирования, и я продолжаю получать эту абсурдную ошибку:

ошибка C2065: ‘cout’: необъявленный идентификатор

Я даже пытался использовать std:: cout, но я получаю еще одну ошибку, которая говорит: IntelliSense: пространство имен «std» не имеет члена «cout» , когда у меня есть объявленный с использованием пространства имен std, включая iostream +, я даже пытался использовать ostream

Я знаю, что это стандартный вопрос о нобе, но это меня насторожило, и я новичок (это означает: я запрограммировал раньше. )

Я использую Visual Studio 2010 и запускаю Windows 7. Все файлы .h имеют «использование пространства имен std» и включают iostream и ostream.

ОТВЕТЫ

Ответ 1

В Visual Studio вы должны #include «stdafx.h» и быть первым включением файла cpp. Например:

Это не будет работать.

Ответ 2

напишите этот код, он отлично работает.

Ответ 3

У меня была такая же проблема на Visual Studio С++ 2010. Это легко исправить. Над функцией main() просто замените стандартные строки с этим ниже, но с символом фунта перед включенными.

Ответ 4

include «stdafx.h» в порядке

Но вы не можете использовать cout , если вы не включили using namespace std

Если вы не включили пространство имен std, вам нужно написать std::cout вместо простого cout

Ответ 5

Я видел, что если вы используете

тогда вы получите эту проблему.

Если вы используете

(уведомление — без .h)

то вы не получите проблему, о которой вы упомянули.

Ответ 6

Если вы начали проект, требующий строки #include «stdafx.h» , поставьте его первым.

Ответ 7

Нижеприведенный код компилируется и запускается правильно для меня, используя gcc. Попробуйте скопировать/вставить это и посмотреть, работает ли он.

Ответ 8

Если единственным файлом, который вы включаете, является iostream, и он все еще говорит undefined, то, возможно, iostream не содержит того, что он должен был. Возможно ли, что у вас есть пустой файл, совпадающий по имени «iostream» в вашем проекте?

Ответ 9

Я видел похожие вещи, когда я использовал расширение .c файла с кодом С++. Кроме этого, я должен согласиться со всеми о багги установке. Это работает, если вы попытаетесь скомпилировать проект с более ранней версией VS? Попробуйте VС++ Express 2008. Его бесплатно на msdn.

Ответ 10

Такое глупое решение в моем случае:

Выше было указано в качестве примера a, когда я изменил его, чтобы он был похож на пример b ниже.

Мой код составлен как шарм. Попробуйте, гарантированно сработает.

Ответ 11

прежде чем вы начнете эту программу, избавитесь от всего кода и сделайте простой мир привет внутри основного. Включать только iostream и использовать пространство имен std;. Постепенно добавьте его, чтобы найти свою проблему.

Ответ 12

У меня есть VS2010, Beta 1 и Beta 2 (один на моей рабочей машине и один на дому), и я использовал std множество без проблем. Попробуйте ввести:

И посмотрите, дает ли Intellisense что-нибудь. Если это дает вам обычный материал ( abort , abs , acos и т.д.), За исключением cout , ну тогда это довольно головоломка. Определенно посмотрите на ваши заголовки С++ в этом случае.

Помимо этого, я бы просто добавил, чтобы убедиться, что вы используете обычный пустой проект (не CLR, где Intellisense поврежден), и что вы на самом деле пытались построить проект хотя бы один раз. Как я уже упоминал в комментарии, VS2010 анализирует файлы после добавления include ; возможно, что что-то застряло в парсере, и он не сразу «нашел» cout . (В этом случае попробуйте перезапустить VS, возможно?)

Ответ 13

У меня была такая же проблема при запуске проекта ms С++ 2010 с нуля — я удалил все файлы заголовков, сгенерированные с помощью ms, но использовал:

Мне пришлось включить stdafx.h , поскольку это вызвало ошибку, в которой он не был.

Ответ 14

из вашего .cpp файла, создайте файл заголовка и поместите его в файл .h. Затем добавьте

в верхней части вашего .cpp-кода. Затем запустите его снова.

Ответ 15

Вы уверены, что он компилируется как С++? Проверьте имя файла (он должен заканчиваться на .cpp ). Проверьте настройки проекта.

Нет ничего плохого в вашей программе, а cout находится в namespace std . Ваша установка VS 2010 Beta 2 является дефектной, и я не думаю, что это просто ваша установка.

Я не думаю, что VS 2010 готов к С++. Стандартная программа «Hello, World» не работала на бета-версии 1. Я просто попытался создать тестовое консольное приложение Win32, а сгенерированный файл test.cpp не имел функции main() .

У меня действительно очень плохое чувство о VS 2010.

Ответ 16

Попробуй, это сработает. Я проверил его в Windows XP, Visual Studio 2010 Express.

Ответ 17

Когда вы создали свой проект, вы не установили правильно использовать предварительно скомпилированные заголовки. Измените его в свойствах → C/С++ → предварительно скомпилированные заголовки.

Ответ 18

В Visual Studio используйте весь ваш фильтр заголовка ниже «stdafx.h».

Ответ 19

Включите библиотеку std, вставив следующую строку вверху вашего кода:

Ответ 20

обычно сохраняется в папке C:Program FilesMicrosoft Visual Studio 8VCinclude. Сначала проверьте, все ли он там. Затем выберите «Инструменты + варианты», «Проекты и решения», «Каталоги VС++», выберите «Включить файлы» в поле «Показать каталоги для» и дважды проверьте, что включение (VCInstallDir) включено в список.

Ответ 21

Я столкнулся с этой ошибкой после того, как установил vs 2010 и просто пытался получить почти идентичную программу для работы.

Я уже делал кодировку ваниль C в коробках в стиле unix, решил, что немного поиграю с этим.

Первая программа, которую я пробовал, была:

Большая вещь, чтобы заметить здесь. если вы все сделали C-кодирование,

Выглядит странно. это должно быть:

В моем случае я просто изменил программу на:

И он отлично работал.

Примечание. Используйте CTRL + F5, чтобы окно консоли закрывалось, чтобы вы могли видеть результаты.

Ответ 22

Просто используйте printf !

Включите stdio.h в заголовочный файл stdafx.h для printf .

Ответ 23

Я пришел сюда, потому что у меня была такая же проблема, но когда я сделал #include «stdafx.h» , он сказал, что не нашел этот файл.
Что для меня было трюком: #include .
Я использую Microsoft Visual Studio 2008.
Это то, что вы можете использовать тогда, в том числе. ‘count’: Ссылка

Ответ 24

Это был компилятор — теперь я использую Eclipse Galileo, и программа работает как чудо

Источник

Что такое ошибка «необъявленный идентификатор» и как ее исправить?

Что такое необъявленные ошибки идентификатора? Каковы общие причины и как их исправить?

Примеры текстов ошибок:

  • Для компилятора Visual Studio: error C2065: ‘printf’ : undeclared identifier
  • Для компилятора GCC: `printf’ undeclared (first use in this function)

8 ответов

Они чаще всего приходят из забывания включить заголовочный файл, содержащий объявление функции, например, эта программа даст ошибку «необъявленного идентификатора»:

Отсутствует заголовок

Чтобы исправить это, мы должны включить заголовок:

Если вы написали заголовок и включили его правильно, заголовок может содержать неправильный include guard.

Неверная переменная

Другой распространенный источник ошибки начинающего возникает, когда вы ошибочно написали переменную:

Неверная область действия

Например, этот код даст ошибку, потому что вам нужно использовать std::string :

Использовать перед объявлением

g не был объявлен до его первого использования. Чтобы исправить это, переместите определение g до f :

Или добавьте объявление g до f :

Не стесняйтесь редактировать этот ответ.

Рассмотрим аналогичную ситуацию в разговоре. Представьте, что ваш друг говорит вам: «Боб подходит к обеду», и вы не знаете, кто такой Боб. Вы будете в замешательстве, верно? Ваш друг должен был сказать: «У меня есть коллега по работе по имени Боб. Боб подходит к обеду». Теперь Боб был объявлен, и вы знаете, о чём говорит ваш друг.

Компилятор испускает ошибку «необъявленного идентификатора», когда вы пытаетесь использовать какой-то идентификатор (что будет именем функции, переменной, класса и т.д.), и компилятор не видел для него объявления. То есть, компилятор понятия не имеет, о чем вы говорите, потому что раньше этого не видел.

Если вы получаете такую ​​ошибку в C или С++, это означает, что вы не сказали компилятору о том, что вы пытаетесь использовать. Объявления часто встречаются в заголовочных файлах, поэтому, вероятно, это означает, что вы не включили соответствующий заголовок. Конечно, возможно, вы просто не помнили, чтобы вообще объявлять сущность.

Некоторые компиляторы дают более конкретные ошибки в зависимости от контекста. Например, попытка скомпилировать X x; , где тип X не был объявлен с clang, скажет вам «неизвестное имя типа X «. Это гораздо более полезно, потому что вы знаете, что пытаетесь интерпретировать X как тип. Однако, если у вас есть int x = y; , где y еще не объявлен, он скажет вам «использование незаявленного идентификатора y «, потому что существует некоторая неопределенность в отношении того, что может представлять собой y .

В C и С++ все имена должны быть объявлены до их использования. Если вы попытаетесь использовать имя переменной или функцию, которая не была объявлена, вы получите ошибку «необъявленный идентификатор».

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

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

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

Эти сообщения об ошибках

означает, что вы используете имя printf , но компилятор не видит, где было объявлено имя и, соответственно, не знает, что это значит.

Любое имя, используемое в программе, должно быть объявлено до его использования. Компилятор должен знать, что означает это имя.

В этом конкретном случае компилятор не видит объявления с именем printf . Как мы знаем (но не компилятор), это имя стандартной функции C, объявленной в заголовке в C или в заголовке в С++, и помещается в стандартную ( std:: ) и глобальную ( :: ) ( не обязательно) пространства имен.

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

Например С

С++:

Иногда причиной такой ошибки является простая опечатка. Например, допустим, что вы определили функцию PrintHello

но в основном вы сделали опечатку, а вместо PrintHello вы набрали PrintHello строчной буквой «p».

В этом случае компилятор выдает такую ​​ошибку, потому что не видит объявления имени PrintHello . PrintHello и PrintHello — это два разных имени, одно из которых было объявлено, а другое не было объявлено, а использовано в теле основного

Источник

В Pine Script существует множество встроенных переменных и функций. Помимо этого мы можем сами создавать свои переменные и писать функции. Это все прекрасно до тех пор, пока при компиляции кода мы не сталкиваемся с ошибкой «undeclared identifier» или «необъявленный идентификатор».

Дело в том то, что одна и та же ошибка возникает по совершенно разным причинам, что затрудняет ее устранение.

Сообщение об ошибке выводится в консоли Pine Editor и выглядит следующим образом:

Pine Script. Ошибка undeclared identifier или необъявленный идентификатор в TradingView?

Идентификатор — это имя, которое мы даем пользовательской переменной или функции, оно находится слева от = или => когда мы создаем нашу переменную или функцию.

Причина № 1. Неправильно введено имя переменной

Чтобы найти ошибку, обратите внимание, в какой строке она появилась (line 8 — строка 8).

Пример индикатора с ошибкой:

Причина № 1. Неправильно введено имя переменной

В данном случае в строке 8 мы используем переменную prVlume, хотя в строке 7 идентификатор называется prVolume. Поэтому выдается ошибка необъявленный идентификатор. Ведь prVlume написано с ошибка, пропущена буква О. Нужно исправить ошибку, сохранить скрипт и снова добавить на график.

Причина № 2. Ошибка регистра в имени переменной или функции

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

Приведем пример того же скрипта, в котором мы допустили ошибку в регистре: вместо prVolume ввели prvolume:

Причина № 2. Ошибка регистра в имени переменной или функции

Можно использовать только строчные буквы, чтобы избежать таких ситуаций.

Причина № 3. Забыли указать скобки при обращении к пользовательской функции

Когда мы создаем функцию TradingView, мы сначала объявляем ее имя, затем перечисляем все параметры в скобках ( ) и заканчиваем кодом функции. В дальнейшем, чтобы правильно сослаться на функцию, после ее имени нужно обязательно ставить скобки.

Если вы забыли скобки, то обязательно столкнетесь с ошибкой TradingView «необъявленный идентификатор», как в этом примере:

Причина № 3. Забыли указать скобки при обращении к пользовательской функции

Чтобы исправить ошибку, в строке 12 нужно написать emaCustom () вместо emaCustom.

Причина № 4. Обновление переменной перед ее объявлением

С помощью оператора (=) мы создаем новую переменную и присваиваем ей какое-то значение. Если мы потом захотим обновить его значение, мы используем оператор (:=). Но это должно быть именно в таком порядке — сначала мы создаем переменную (с помощью =), затем мы можем ее изменить ( :=).

Когда мы путаем местами эти операторы и сначала используем ( :=), а потом (=), то получаем ошибку undeclared identifier, например:

Причина № 4. Обновление переменной перед ее объявлением

В данном случае, чтобы исправить ошибку, нужно в 7 строке написать: prV = volume[1]

А в 8-й строке: prV := ta.sma (close, 50).

Причина № 5. Использование самоссылающейся переменной без (:=)

Ситуация усложняется, когда мы получаем ошибку «необъявленный идентификатор» (undeclared identifier) с пользовательской переменной, ссылающейся на себя.

Когда переменная ссылается на свое собственное предыдущее значение (например, profit := profit[1] + todayProfit ), эта переменная называется самоссылающейся переменной.

Обратите внимание, что ошибка возникает только с пользовательскими переменными, а не со встроенными типа: close, open, high, low, bar_inex и пр.

Нужно сделать две вещи, чтобы избежать ошибки:

  1. Создайте переменную с помощью оператора (=) и установите для нее значение по умолчанию ( profit = 0.0).
  2. Второй шаг — обновить переменную до нового значения с помощью оператора (:=). После этого вы можете ссылаться на предыдущие значения этой переменной.

Приведем пример:

//@version=5

indicator(title=‘price’, overlay=false)

ClosePlus = nz(ClosePlus[1]) + 2

plot(series=ClosePlus, color=color.orange, linewidth=2)

plot(series=close, color=color.purple, linewidth=2)

В таком виде скрипт выдает ошибку: undeclared identifier.

Причина № 5. Использование самоссылающейся переменной без (:=)

Чтобы индикатор работал корректно, нужно перед 6 строкой установить значение по умолчанию для переменной: ClosePlus = 0.0.

А в 6-ой строке заменить оператор (=) на (:=). После этого скрипт скомпилируется без ошибок:

Причина № 5. Использование самоссылающейся переменной без (:=)

Заключение:

  1. Ошибка undeclared identifier (необъявленный идентификатор) появляется если мы делаем ошибку в имени переменной или функции, а также если мы забываем поставить () после имени функции.
  2. Обновление переменной перед ее инициализацией. С помощью оператора (=) мы создаем новую переменную, а с помощью оператора ( :=) меняем ее значение. Если перепутать местами эти операторы, то тоже получим ошибку необъявленный идентификатор.
  3. При создании пользовательской самоссылающейся переменной (например profit[1]) нужно сначала установить ее значение по умолчанию на 0.0 или 1.0 при помощи оператора (=), затем обновить переменную до нового значения с помощью оператора (:=).

Понравилась статья? Поделить с друзьями:
  • Необходимость увеличения хранилища icloud как исправить
  • Необходимо улучшить уровень знаний учащихся ошибка
  • Необходимо уделять более серьезное значение речевым ошибкам студентов
  • Необходимо увеличить уровень благосостояния наших ветеранов ошибка
  • Необходимо то чтобы ты прочитал поэму лермонтова демон где ошибка