Меню

Ошибка 1 error c2065 i необъявленный идентификатор

description title ms.date f1_keywords helpviewer_keywords ms.assetid

Learn more about: Compiler Error C2065

Compiler Error C2065

06/29/2022

C2065

C2065

78093376-acb7-45f5-9323-5ed7e0aab1dc

Compiler Error C2065

identifier‘ : undeclared identifier

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.

// C2065_spell.cpp
// compile with: cl /EHsc C2065_spell.cpp
#include <iostream>
using namespace std;
int main() {
    int someIdentifier = 42;
    cout << "Some Identifier: " << SomeIdentifier << endl;
    // C2065: 'SomeIdentifier': undeclared identifier
    // To fix, correct the spelling:
    // cout << "Some Identifier: " << someIdentifier << endl;
}

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:

// C2065_scope.cpp
// compile with: cl /EHsc C2065_scope.cpp
#include <iostream>
// using namespace std;   // Uncomment this line to fix

int main() {
    cout << "Hello" << endl;   // C2065 'cout': undeclared identifier
                               // C2065 'endl': undeclared identifier
    // Or try the following line instead
    std::cout << "Hello" << std::endl;
}

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.

Example: precompiled header isn’t first

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 <iostream> 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.

// pch.h (stdafx.h in Visual Studio 2017 and earlier)
#include <stdio.h>

The pch.h or stdafx.h source file:

// pch.cpp (stdafx.cpp in Visual Studio 2017 and earlier)
// Compile by using: cl /EHsc /W4 /c /Ycstdafx.h stdafx.cpp
#include "pch.h"

Source file C2065_pch.cpp:

// C2065_pch.cpp
// compile with: cl /EHsc /W4 /Yustdafx.h C2065_pch.cpp
#include <iostream>
#include "stdafx.h"
using namespace std;

int main() {
    cout << "Hello" << endl;   // C2065 'cout': undeclared identifier
                               // C2065 'endl': undeclared identifier
}

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

Example: missing header 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.

// C2065_header.cpp
// compile with: cl /EHsc C2065_header.cpp

//#include <stdio.h>
int main() {
    fpos_t file_position = 42; // C2065: 'fpos_t': undeclared identifier
    // To fix, uncomment the #include <stdio.h> line
    // to include the header where fpos_t is defined
}

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

// C2065_initializer.cpp
// compile with: cl /EHsc C2065_initializer.cpp

// #include <initializer_list>
int main() {
    for (auto strList : {"hello", "world"})
        if (strList == "hello") // C2065: 'strList': undeclared identifier
            return 1;
    // To fix, uncomment the #include <initializer_list> line
}

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.

// C2065_quote.cpp
// compile with: cl /EHsc C2065_quote.cpp
#include <iostream>

int main() {
    // Fix this issue by adding the closing quote to "Aaaa"
    char * first = "Aaaa, * last = "Zeee";
    std::cout << "Name: " << first
        << " " << last << std::endl; // C2065: 'last': undeclared identifier
}

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.

// C2065_iter.cpp
// compile with: cl /EHsc C2065_iter.cpp
#include <iostream>
#include <string>

int main() {
    // char last = '!';
    std::string letters{ "ABCDEFGHIJKLMNOPQRSTUVWXYZ" };
    for (const char& c : letters) {
        if ('Q' == c) {
            std::cout << "Found Q!" << std::endl;
        }
        // last = c;
    }
    std::cout << "Last letter was " << c << std::endl; // C2065
    // Fix by using a variable declared in an outer scope.
    // Uncomment the lines that declare and use 'last' for an example.
    // std::cout << "Last letter was " << last << std::endl; // C2065
}

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:

// C2065_defined.cpp
// Compile with: cl /EHsc /W4 /MT C2065_defined.cpp
#include <iostream>
#include <crtdbg.h>
#ifdef _DEBUG
    _CrtMemState oldstate;
#endif
int main() {
    _CrtMemDumpStatistics(&oldstate);
    std::cout << "Total count " << oldstate.lTotalCount; // C2065
    // Fix by guarding references the same way as the declaration:
    // #ifdef _DEBUG
    //    std::cout << "Total count " << oldstate.lTotalCount;
    // #endif
}

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).

// C2065_b.cpp
// compile with: cl /clr C2065_b.cpp
generic <typename ItemType>
void G(int i) {}

int main() {
   // global generic function call
   G<T>(10);     // C2065
   G<int>(10);   // OK - fix with a specific type argument
}

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_attributes.cpp
// compile with: cl /c /clr C2065_attributes.cpp
[module(DLL, name=MyLibrary)];   // C2065
// try the following line instead
// [module(dll, name="MyLibrary")];

[export]
struct MyStruct {
   int i;
};

First off, I’m completely out of my depth here. So the question might be the wrong one to ask, but here goes…

As per the accepted answer to this question, I’m trying to compile the bindings for the Audiere library, which are produced by Harald Fielker and available in the mailing list archives.

I’ve opened the .vcproj file in VC++ Express Edition and it converted it to a solution it could use. I’ve then gone into the properties and added:

  • «C:Documents and Settingstdw20My Documentsaudiere-win32include» to the additional include directories

  • «C:Documents and Settingstdw20My DocumentsDownloadsaudiere-win32lib» to the additional library directories

Yet I still get «undeclared identifier» errors. The full output is listed on pastebin.

Does anyone have any idea what might be wrong?

5

I can only start to guess, but are you sure the header files are where you anticipate them to be?

1

The OutputStream class referenced in outputstream.cpp isn’t being recognised. As far as i can tell it’s defined in the audiere.h header file in the audiere project, and the #include directive at line 2 of outputstream.cpp should be including that file.

Two things to try in VC++:

  1. In line 8 of outputstream.cpp double-click on OutputStream and then right-click, and on the context menu select Go To Definition. See what file it opens (if any).
  2. Right-click line 2 (#include <audiere.h>) and select Open Document…. Again see if it opens a file.

Actually, just realied you said you added C:Documents and Settingstdw20My Documentsaudiere-win32include to the include but it looks to me like audiere.h is in a src sub-directory of audiere. Also the path you specified for the libs is inconsistent — it has an extra Downloads dir in the path. Are both these paths definitely correct? The dir you add to the include path should contain header files such as audiere.h and the dir for the libs should contain .lib files.

3

You shouldn’t need to compile outputstream.cpp for the C# binding’s libaudieresharpglue.dll. Did you download Audiere 1.9.4 Win32 binary release? I actually encountered an issue where I downloaded an old version of Audiere from 2002, I think, and it gave me a ton of trouble until I realized I had the wrong version.

The only source file you should need to worry about is include/audiere.h. You’ll link against lib/audiere.lib, and at runtime your application will need to access bin/audiere.dll (which should probably be moved to your executable’s directory, on on the DLL path, when you run your executable).

0

yk92

0 / 0 / 2

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

Сообщений: 35

1

07.11.2010, 20:35. Показов 106742. Ответов 35

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


видаёт мне такую ошибку:
1>c:documents and settingsадминистратор.home-8a34687735мои документыvisual studio 2010projectslab 1.3lab 1.3lab 1.3.cpp(41): error C2065: cout: необъявленный идентификато
ето для cin, cout u endl.
Подскажите что делать
вот текст програми

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
#include <iostream>
 
#include "StdAfx.h"
using namespace std;
 
int main (void)
{
int massiv[5];
int min;
int srednee;
for(int i=0;i<5;i++)
{
cin>>massiv[i];
}
_asm 
{
lea esi,massiv;
mov ecx,5;
mov edx,[esi];
xor edi,edi;
 
cikl: mov ebx,[esi];
      add edi,ebx;
      cmp ebx,edx;
      jg lab1;
      mov edx,ebx;
lab1:
      dec ecx;
      add esi,4;
      cmp ecx,0;
      jnz cikl;
      mov min,edx;
      mov srednee,edi;
 
}
for(int i=0;i<5;i++)
{
cout<<massiv[i]<<" ";
}
cout<<endl<<"MIN->"<<min<<endl;
cout<<"Tselaya chast ot Srednego arifmeticheskogo->"<<srednee/5;
getchar();
getchar();
return(0);
}

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



0



Programming

Эксперт

94731 / 64177 / 26122

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

Сообщений: 116,782

07.11.2010, 20:35

35

Ignat

1260 / 798 / 108

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

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

07.11.2010, 22:38

2

Надо сначала подключить Stdafx, а уже потом iostream, короче говоря поменять местами строки.

C++
1
2
#include "stdafx.h"
#include <iostream>



6



vaselo

19 / 19 / 5

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

Сообщений: 247

07.11.2010, 23:40

3

C++
1
2
3
4
5
6
7
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
 
using std::cout;
using std::cin;
using std::endl;

в вижуале он почему-то требует вот такого описания. Может ты еще и фигурную скобку не открыл?



0



M128K145

Эксперт JavaЭксперт С++

8376 / 3598 / 419

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

Сообщений: 10,708

08.11.2010, 11:02

4

vaselo, уже есть

C++
1
using namespace std;

а избыточность ни к чему. Правильный ответ во втором посте



0



Antariya

0 / 0 / 0

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

Сообщений: 4

08.06.2011, 23:23

5

А что делать в 10й висуал студо(экспресс)?
Та же ошибка:
error C2065: endl: необъявленный идентификатор
error C2065: end: необъявленный идентификатор.
Добавление строчки:

C++
1
using namespace std;

не помогает.

(Либерти, упражнение 2, день 1)

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include "stdafx.h"
#include <iostream>
 
int _tmain(int argc, _TCHAR* argv[])
{
    int x = 5;
    int y = 7;
    std::cout << endl;
    std::cout << x + y << " " << x * y;
    std::cout << end;
    return 0;
}



0



593 / 531 / 76

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

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

08.06.2011, 23:43

6

Antariya,
std::endl;
+ опечатка в 10 строке

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

не помогает.

а вот это странно



0



Эксперт JavaЭксперт С++

8376 / 3598 / 419

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

Сообщений: 10,708

09.06.2011, 00:13

7

Antariya, а мне кажется, что кто-то пытается нас обмануть. При том коде, который сейчас должны вылетать две ошибки:
error C2065: endl: необъявленный идентификатор
error C2065: end: необъявленный идентификатор.
при добавлении юзинга должна вылетать только одна ошибка
error C2065: end: необъявленный идентификатор.



0



0 / 0 / 0

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

Сообщений: 4

09.06.2011, 12:40

8

OstapBender, именно как в книге написала. Попробовала исправить.
Ошибки:
warning C4067: непредвиденные лексемы за директивой препроцессора, требуется newline
warning C4551: в вызове функции отсутствует список аргументов
error C2568: идентификатор: не удается разрешить перегрузку функции
warning C4551: в вызове функции отсутствует список аргументов
M128K145, если бы обманывала. Только начала изучение, имела дело только с бейсиком в школе.



0



3096 / 2415 / 257

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

Сообщений: 5,455

09.06.2011, 12:49

9

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



0



Antariya

0 / 0 / 0

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

Сообщений: 4

09.06.2011, 12:51

10

kazak, А. Точно. Извиняюсь.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// day.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>;
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
        int x = 5;
        int y = 7;
        std::endl;
        std::cout << x + y << " " << x * y;
        std::end;
        return 0;
}

warning C4067: непредвиденные лексемы за директивой препроцессора, требуется newline
warning C4551: в вызове функции отсутствует список аргументов
error C2568: идентификатор: не удается разрешить перегрузку функции
warning C4551: в вызове функции отсутствует список аргументов



0



diagon

Higher

1953 / 1219 / 120

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

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

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

09.06.2011, 12:53

11

C++
1
2
3
4
5
6
7
8
9
10
11
#include "stdafx.h"
#include <iostream>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
        int x = 5;
        int y = 7;
        cout << endl <<  x + y << " " << x * y << endl;
        return 0;
}

После #include <iostream> не надо точку с запятой
если пишите using namespace std; то нет смысла писать std::
endl нужно использовать прямо в потоке.
end- непонятно что такое, видимо опечатка в endl



1



kazak

3096 / 2415 / 257

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

Сообщений: 5,455

09.06.2011, 12:54

12

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

C++
1
2
3
std::endl;
 std::cout << x + y << " " << x * y;
 std::end;

endl в отдельности не используется, end вообще не существует.

C++
1
2
3
std::cout << std::endl;
 std::cout << x + y << " " << x * y;
 std::cout << std::endl;



1



0 / 0 / 0

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

Сообщений: 4

09.06.2011, 13:44

13

kazak, diagon, всё получилось, огромное спасибо.



0



Oleg35

0 / 0 / 0

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

Сообщений: 8

30.10.2012, 19:41

14

Здравствуйте, а можете мне помочь?

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
#include "stdafx.h"
#include <iostream>
 
int main()
{
    int a, b;
    char op; //operator
    int res; //result
 
    cout << "Enter expression ";
    cin >> a;
    cin >> op;
    cin >> b;
 
    if (op== '+')
        res = a+b;
    else if (op == '-')
        res = a-b;
    else if (op == '*')
        res = a*b;
    else if (op == '/')
        res = a/b;
    else
    {   cout << "Bad operator";
        return 0;
    }
        
    
    cout << "Result = ";
    cout << res;
    cout << end;
    
    return 0;
}

выдает (при отладке)

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

(Урок 2- http://data.com1.ru/prog-schoo… esson2.mp4

Visual 08-Упрощенная(тоесть только для C++)



0



M128K145

Эксперт JavaЭксперт С++

8376 / 3598 / 419

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

Сообщений: 10,708

30.10.2012, 20:56

15

Oleg35, используйте std::cout, std::cin и std::endl или после инклудов напишите

C++
1
using namespace std;

Первый вариант предпочтительнее



0



Мой лучший друг-отладчик!

166 / 166 / 30

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

Сообщений: 662

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

30.10.2012, 22:09

16

M128K145, в ходе обучения использование using namespace std; вместо std:: способствует, как мне кажется, лучшему восприятию кода.И на ранних этапах обучения программированию использвание пространства предпочтительнее.

Но с другой стороны, в профессиональном программировании, насколько я знаю, юзать нужно только std::.Мне тут все модеры это твердили.И уже за собой тоже заметил — постоянно пишу std:: вместо namespace



0



Эксперт JavaЭксперт С++

8376 / 3598 / 419

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

Сообщений: 10,708

30.10.2012, 23:20

17

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

M128K145, в ходе обучения использование using namespace std; вместо std:: способствует, как мне кажется, лучшему восприятию кода.И на ранних этапах обучения программированию использвание пространства предпочтительнее.

если постоянно привыкать спать на потолке(ну как начинающий), то со временем вы уже с трудом сможете переучится спать как и все люди — на диване, который стоит на полу и то, если захочется



0



0 / 0 / 0

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

Сообщений: 8

31.10.2012, 15:09

18

Вставил не помогло, теперь выдает это

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



0



Мой лучший друг-отладчик!

166 / 166 / 30

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

Сообщений: 662

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

31.10.2012, 15:14

19

Нет в С++ оператора end!!!Есть endl.
Замените end на endl



1



0 / 0 / 0

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

Сообщений: 8

31.10.2012, 15:21

20

Ура, спасибо большое. Вот оказывается где собака была зарыта.



0



Здравствуйте. Я новичок в C++. На работе ковыряюсь в чужом проекте. В файле есть два метода. В одном из них используется класс. Я хочу использовать этот класс в другом методе, на что компилятор выдает error C2065: undeclared identifier. Вот схематичное описание ситуации:

temlate<class Base>
class CLASS
{
   void visit()
   {
      // bla bla bla
      Device d;  // 'Device' : undeclared identifier
      //bla bla bla
   }
   void Draw()
   {
      // bla bla bla
      Device d;  // It's OK
      //bla bla bla
   }
};

Не могу понять почему это так. Пробовал менять методы местами, но ошибка остается, причем именно на ту же самую строку (в методе visit). Подскажите пожалуйста как это исправить. Заранее спасибо!

UPD:
Если закомментировать использование Device в методе visit, то все отлично работает (проект рабочий, я его просто допиливаю):

class CLASS
{
   void visit()
   {
      // bla bla bla
      // Device d;  // now it's OK
      //bla bla bla
   }
   void Draw()
   {
      // bla bla bla
      Device d;  // It's OK
      //bla bla bla
   }
};

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

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

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

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

#include <iostream>
using namespace std;

int main () {
    cout << "hey" << endl;
 return 0;
}

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

4b9b3361

Ответ 1

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

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

#include <iostream>
using namespace std;
int main () {
    cout << "hey" << endl;
    return 0;
}




#include <iostream>
#include "stdafx.h"
using namespace std;
int main () {
    cout << "hey" << endl;
    return 0;
}

Это подойдет.

#include "stdafx.h"
#include <iostream>
using namespace std;
int main () {
    cout << "hey" << endl;
    return 0;
}

Вот отличный ответ о том, что делает заголовок stdafx.h.

Ответ 2

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

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

using namespace std;

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

Ответ 3

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

# include "stdafx.h"
# include <iostream>
using  namespace std;

Ответ 4

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

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

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

Ответ 5

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

#include <iostream.h>

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

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

#include <iostream>  

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

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

Ответ 6

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

Ответ 7

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

#include <iostream>
using namespace std;

int bob (int a) { cout << "hey" << endl; return 0; };

int main () {
    int a = 1;
    bob(a);
    return 0;
}

Ответ 8

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

Ответ 9

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

Ответ 10

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

// Example a
#include <iostream>    
#include "stdafx.h"

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

// Example b
#include "stdafx.h"
#include <iostream>  

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

Ответ 11

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

cout << "hi" << endl;

Ответ 12

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

std::

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

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

Ответ 13

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

#include "stdafx.h"
#include <iostream>
using namespace std;

int main() {
   cout << "hey" << endl;
   return 0;
}

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

Ответ 14

Возьмите код

#include <iostream>
using namespace std;

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

#include "whatever your header file is named.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.

#include "stdafx.h"
#include <iostream>
using namespace std;

void main( ) 
{
   int i = 0;
   cout << "Enter a number: ";
   cin >> i;
}

Ответ 17

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

Ответ 18

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

Ответ 19

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

using namespace std;

Ответ 20

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

Ответ 21

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

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

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

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Hello World!";
    return 0;
}

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

int _tmain(int argc, _TCHAR* argv[])

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

int main( int argc, char ** argv )

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

#include <iostream>
using namespace std;

int main()
{
     cout << "Hello world from  VS 2010!n";
     return 0;
}

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

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

Ответ 22

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

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

Ответ 23

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

Ответ 24


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


Во-первых, я совершенно не в себе. Так что вопрос может быть неправильным, но вот …

Согласно принятому ответу на этот вопрос, Я пытаюсь скомпилировать привязки для Библиотека Audiere, которые производятся Harald Fielker и доступны в архивы списков рассылки.

Я открыл файл .vcproj в VC ++ Express Edition, и он преобразовал его в решение, которое можно было бы использовать. Затем я вошел в свойства и добавил:

  • «C: Documents and Settings tdw20 My Documents audiere-win32 include» в дополнительные каталоги включения

  • «C: Documents and Settings tdw20 My Documents Downloads audiere-win32 lib» в дополнительные каталоги библиотеки.

Тем не менее, я все еще получаю ошибки «необъявленный идентификатор». Полный вывод указан на пастебине.

Кто-нибудь знает, что может быть не так?

3 ответы

Я могу только догадываться, но уверены ли вы, что файлы заголовков находятся там, где вы их ожидаете?

Компания OutputStream класс, указанный в выходной поток.cpp не узнается. Насколько я могу судить, это определено в audiere.h заголовочный файл в проекте audiere, а #include директива в строке 2 outputstream.cpp должна включать этот файл.

Две вещи, которые стоит попробовать в VC ++:

  1. В строке 8 файла outputstream.cpp дважды щелкните OutputStream а затем щелкните правой кнопкой мыши и в контекстном меню выберите Перейти к определению. Посмотрите, какой файл он открывает (если есть).
  2. Щелкните правой кнопкой мыши строку 2 (#include <audiere.h>) и выберите Открыть документ …. Снова посмотрите, открывает ли он файл.

На самом деле, только что понял, что вы сказали, что добавили C: Documents and Settings tdw20 My Documents audiere-win32 include к включению, но мне кажется, что audiere.h находится в SRC подкаталог audiere. Также путь, который вы указали для библиотек, несовместим — у него есть лишний Каталог загрузок в пути. Оба эти пути определенно верны? Каталог, который вы добавляете к пути включения, должен содержать файлы заголовков, такие как audiere.h и каталог для библиотек должен содержать .lib файлы.

Вам не нужно компилировать outputstream.cpp для libaudieresharpglue.dll привязки C #. Вы скачали двоичную версию Audiere 1.9.4 Win32? Я действительно столкнулся с проблемой, когда я загрузил старую версию Audiere с 2002 года, я думаю, и это доставило мне массу проблем, пока я не понял, что у меня неправильная версия.

Компания только исходный файл, о котором вам следует беспокоиться, это include/audiere.h. Вы свяжетесь с lib/audiere.lib, и во время выполнения вашему приложению потребуется доступ bin/audiere.dll (который, вероятно, должен быть перемещен в каталог вашего исполняемого файла по пути DLL, когда вы запускаете свой исполняемый файл).

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками

c++
visual-studio-2008

or задайте свой вопрос.

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

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

  • Для компилятора 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

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Ошибка 1 10087 на телефоне самсунг
  • Ошибка 0чу8000015 при восстановлении iphone