You are attempting to call a function truncate() at:
centimeters = truncate(centimeters);
You have not yet told the compiler what that function is, so it is undefined and the compiler is objecting.
In C++, all functions must be declared (or defined) before they are used. If you think you are using a standard C++ library function, you need to include its header. If you are not sure that you are using a C++ library function, you need to declare and define your own.
Be aware that on POSIX-based systems, truncate() is a system call that truncates an existing file; it will have a different prototype from what you are trying to use.
Further down your code — hidden off the bottom of the scroll bar — are the function definitions for truncate() and round(). Put the function definitions at the top of the file, so that the compiler knows about their signature before they are used. Or add forward declarations of the functions at the top of the file and leave the definitions where they are.
Очень часто начинающие программисты впадают в суеверный ужас, когда видят, что компилятор нашел в тексте программы ошибку, но не понимают, в чем она заключается.
А если помножить этот факт на незнание английского языка («чего там ему не нравится?..») и слабое владение синтаксисом C++ («хм, а может, тут нужна точка с запятой…»), то проблема принимает масштаб катастрофы.
Тот факт, что компилятор в силу своих ограниченных возможностей изо всех сил старается объяснить, что конкретно неверно, не спасает ситуацию. Как быть, если гуглить неохота, а спросить не у кого?
В этом посте на правах копипаста с последующим переводом, дополнениями и исправлениями приведу описание наиболее распространенных сообщений об ошибках и предупреждений компилятора. Неприятность кроется в том факте, что разные компиляторы ругаются на одинаковые ошибки по-разному, а некоторые даже не замечают то, что другие принимают за ошибку. Все зависит от совести разработчиков компилятора, даты его выпуска, и др.
В качестве компилятора возьмем g++, который, в частности, может использоваться в среде Code::Blocks. Версия gcc (куда входит g++) для ОС Windows зовется MinGW. По ходу я буду давать аналоги ошибок из лексикона русскоязычной Microsoft Visual C++.
Итак, частые ошибки:
undeclared identifier
1) Пример
doy.cpp: In function 'int main()':
doy.cpp:25: 'DayOfYear' undeclared (first use this function)
doy.cpp:25: (Each undeclared identifier is reported only once for each function it appears in.)
doy.cpp:25: parse error before ';' token
2) Смысл
Использован идентификатор DayOfYear, но компилятор не нашел его объявления. Он не знает, что такое DayOfYear.
3) Когда бывает
- Вы забыли включить какой-то заголовочный файл (
#include...) - Вы где-то ошиблись в написании идентификатора (при объявлении или использовании)
- Вы вообще забыли, что эту переменную надо объявить
Попытавшись скомпилировать это в Microsoft Visual C++, вы увидите:
error C2065: DayOfYear: необъявленный идентификатор
cout undeclared
1) Пример
xyz.cpp: In function 'int main()':
xyz.cpp:6: 'cout' undeclared (first use this function)
xyz.cpp:6: (Each undeclared identifier is reported only once for each function it appears in.)
2) Смысл
Суперклассика. Без комментариев.
3) Когда бывает
- Вы забыли включить
<iostream> - Вы забыли написать
using namespace std;
jump to case label
1) Пример
switch.cpp: In function 'int main()':
switch.cpp:14: jump to case label
switch.cpp:11: crosses initialization of 'int y'
2) Смысл
Смысл туманен
3) Когда бывает
Вы попытались объявить и инициализировать переменную (объект, указатель и т.п.) в метке case оператора выбора switch. Правилами C++ это запрещено.
В Microsoft Visual C++ эта ошибка зовется
error C2360: пропуск инициализации 'y' из-за метки 'case'
Выход: заключите операторы этого case’а в фигурные скобки {}.
multi-line string / unterminated string
1) Пример
Программка
#include <iostream>
using namespace std;
int main()
{
cout << "Bob is my buddy;
cout << "and so is Mary" << endl;
}
вызовет бурную реакцию компилятора:
string.cpp:7:12: warning: multi-line string literals are deprecated
string.cpp: In function 'int main()':
string.cpp:7: 'so' undeclared (first use this function)
string.cpp:7: (Each undeclared identifier is reported only once for each function it appears in.)
string.cpp:7: parse error before 'Mary'
string.cpp:8:28: warning: multi-line string literals are deprecated
string.cpp:8:28: missing terminating " character
string.cpp:7:12: possible start of unterminated string literal
2) Смысл
Компилятор думает, что мы хотим создать строковую константу с содержащимся в ней переносом строки, что-то типа
"Hello
world!"
что не поддерживается языком. Также делается предположение о том, что мы, возможно, забыли поставить кавычки в конце первой строки. Собственно, так оно и есть.
3) Когда бывает
Когда не соблюдается правильное количество и положение кавычек в строковых литералах. Надо быть внимательнее.
Microsoft Visual C++ со свойственной ему детской непосредственностью, отметит, что нельзя делать переносы в строках и возмутится, где точка с запятой:
error C2001: newline в константе
error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "cout"
comparison between signed and unsigned integer expressions
1) Пример
xyz.cpp: In function 'int main()':
xyz.cpp:54: warning: comparison between signed and unsigned integer expressions
2) Смысл
Это — предупреждение компилятора, которое говорит о том, что мы пытаемся сравнить (==, и т.д.) целочисленное выражение (может принимать положительные, отрицательные значения и 0) и беззнаковое целочисленное выражение (может быть только положительным, либо 0).
3) Когда бывает
Собственно, тогда и бывает. Напомню, что тип int по умолчанию знаковый, а некоторые функции (например, vector::size()) возвращают unsigned int.
К примеру, следующий на первый взгляд безобидный код вызовет описываемое предупреждение:
for (int i = 0; i < grades.size(); i++)
{
// ...
}
Следует помнить, что в памяти знаковые и беззнаковые типы имеют разные внутренние представления, поэтому надо быть чертовски осторожными с указателями.
В Microsoft Visual C++ предупреждение выглядит так:
warning C4018: <: несоответствие типов со знаком и без знака
suggest parentheses around assignment used as truth value
1) Пример
xyz.cpp: In function `int main()':
xyz.cpp:54: warning: suggest parentheses around assignment used as truth value
2) Смысл
Тоже классика. Компилятор предполагает (и в 99% случаев прав), что вы по ошибке включили в скобки в качестве условия для if/while/for вместо условного выражения выражение присваивания.
3) Когда бывает
Чаще всего — в if‘ах, когда вместо "==" используется "="
if (length = maxLength)
вместо
if (length == maxLength)
Заминка в том, что это не ошибка, т.к. в скомпилированной программе (если мы проигнорируем предупреждение) выражение присваивания (которое возвращает значение правого аргумента) во всех случаях, кроме тех, когда оно вернет 0, будет преобразовано к true.
Ссылки для дальнейшего изучения
Ошибки построения Microsoft Visual C++
GCC Compiler error messages
GCC Warnings
P.S. Следует отметить, что кроме ошибок стадии компиляции встречаются (гораздо реже) ошибки препроцессора (например, если не найден заголовочный файл <iostram>), ошибки стадии компоновки (можно избежать, если научиться пользоваться средой программирования) и — самый гнусный тип ошибок! — ошибки стадии выполнения. Т.н. runtime error. С ними может справиться только голова программиста, вооруженная отладчиком.
это перевод страницы «CSM217: C for Computer Scientists Common gcc Compiler Errors» staff.um.edu.mt/csta1//courses/lectures/csa2060…
(чтобы не затерялось на диске)
Ниже приведены список наиболее часто встречающихся во время компиляции ошибок и предупреждений компилятора gcc, а также объяснения причин их возникновения. Обратите, пожалуйста, внимание, что данный материал применим к UNIX-подобным операционным системам.
В квадратных скобках приводится перевод системных сообщений.
Список ошибок
Описание общих ошибок / предупреждений компилятора
‘variable’ undeclared (first use in this function)
[‘переменная’ не определена (первое использование в этой функции)]
unknown escape sequence
[неизвестная управляющая последовательность]
No such file or directory
[Нет такого файла или каталога]
ld: elf error: file prog:
[ld: ошибка формата elf: файл prog:]
parse error before ‘string’
[ошибка разбора перед ‘строкой’]
Undefined symbol
[Неопределённый символ]
character constant too long
[слишком длинная символьная константа]
passing arg n of ‘function’ makes
data type from another data type without a cast
[передаваемый аргумент n функции ‘function’ создаёт
тип данных из другого типа данных без приведения]
unterminated string or character constant
[незавершённая строка или символьная константа]
parse error at end of input
[ошибка разбора в конце ввода]
Описание общих ошибок / предупреждений компилятора
В Си ошибки компиляции обычно являются критическими, то есть Си-компилятор не может скомпилировать ваш код. В то же время предупреждение — это просто предупреждение: компилятор выявил потенциальную проблему, но, тем не менее, смог создать объектный код. Предупреждения не следует игнорировать, они означают обычно, что что-то не так с вашей программой, и скорее всего, она поведёт себя не совсем так, как вы ожидаете.
Перед сообщениями об ошибках и предупреждениями отображается имена файла и функции, в которых произошла ошибка. Например,
prog.c: In function ‘main’:
[prog.c: В функции ‘main’:]
означает, что ошибка произошла при компиляции программного файла prog.c, а точнее, в функции main. В следующих строках отображаются ошибки / предупреждения для данных файла и функции. Если в коде несколько функций и/или несколько файлов, то каждый файл / функция, содержащий ошибки, будет показан отдельно.
Строки сообщения об ошибке/предупреждения, следующие за именем файла / функции, содержат:
- имя файла / функции, содержащего ошибку;
- номер строки в исходном файле, где встретилась ошибка;
- строку «warning» [«предупреждение»], если сообщение является предупреждающим (при ошибке эта строка пустая);
- описание встреченной ошибки.
Например,
prog.c:3: warning: unknown escape sequence ‘z’
[prog.c:3: предупреждение: неизвестная управляющая последовательность ‘z’]
означает, что существует проблема в строке 3 файла prog.c. Это сообщение — только предупреждение: не существует управляющей последовательности ‘z’. Программа будет скомпилирована (если только не будет других ошибок), так как это просто предупреждение. Однако, скорее всего, программа поведёт себя не совсем так, как вы ожидаете.
‘variable’ undeclared (first use in this function) [‘переменная’ не определена (первое использование в этой функции)]
Си — это типизированный язык, то есть требуется объявлять переменные перед началом их использования. Си также регистрозависимый язык, то есть var и Var — разные переменные. Вы либо забыли объявить переменную, либо ошиблись в написании её имени.
Это сообщение об ошибке — компилятор не смог скомпилировать код. Обычно данное сообщение сопровождается текстом (Each undeclared identifier is reported only once for each function it appears in.) [(Выводится только одно сообщение на функцию для каждого необъявленного идентификатора.)].
Одна и та же необъявленная переменная может несколько раз встречаться в функции, но компилятор сообщает только о первом случае.
unknown escape sequence ‘z’ [неизвестная управляющая последовательность]
Управляющая последовательность — это символ, перед которым находится обратный слеш ». Наличие » изменяет функцию последующего символа. Например, ‘n’ — это символ n, но ‘n’ — это знак перевода строки. Для некоторых символов, например, z, нет управляющих последовательностей. Программа будет скомпилирована (если только не будет других ошибок), так как это просто предупреждение. Однако, скорее всего, программа поведёт себя не совсем так, как вы ожидаете.
No such file or directory [Нет такого файла или каталога]
Вы дали команду скомпилировать файл, которого не существует. Ожидается, что файлы исходных кодов Си-программ будут иметь расширение .c. Если исходный код находится в файле proc.c, следует использовать команду компиляции gcc prog.c. Попытка выполнить gcc prog приведёт к этой ошибке. Данная ошибка обычно сопровождается сообщением No input files [Нет входных файлов].
ld: elf error: file prog: [ld: ошибка формата elf: файл prog:]
Обычно вы также увидите следующее сообщение…
unknown type, unable to process using elf(3E) libraries
ld: fatal: File processing errors. No output written to a.out
collect2: ld returned 1 exit status
[неизвестный тип, невозможно обработать, используя библиотеки elf(3E)
ld: критическое: Ошибки обработки файла. В файл a.out ничего не записано
collect2: ld вернул статус выхода 1 ]
Неприятная ошибка; к счастью, её легко исправить! Код вашей Си-программы находится в файле prog, но, поскольку вы не использовали расширение .c для этого файла, gcc не может понять, какого типа программный код содержится в указанном файле. Для исправления ошибки просто переименуйте prog в prog.c.
parse error before ‘string’ [ошибка разбора перед ‘строкой’]
Си-компилятор встретил что-то, что он не смог не только распознать, но даже и предположить, что бы это могло быть. Объявления в Си обычно начинаются с зарезервированного слова, имени переменной или имени функции. Подобная ошибка получается, когда не распознаётся первое слово в объявлении, и оно не является ни вызовом функции, ни именем переменной и т.п., например,
main() {
silly printf("Hello, worldn"
;
}
Иногда данная ошибка вызывается отсутствующей закрывающей скобкой ()) или фигурной скобкой (}) где-то в районе указанной строки — перед символом или строкой, указанными в маркере (token). Также возможно, что у вас в коде лишние скобки! А может быть пропущена закрывающая предыдущее объявление точка с запятой (
.
Undefined symbol [Неопределённый символ]
Undefined first referenced
symbol in file
main /usr/local/lib/gcc-lib/sparc-sun-solaris2.7/2.95.2/crt1.o
ld: fatal: Symbol referencing errors. No output written to a.out
collect2: ld returned 1 exit status
[Неопределённый впервые встречается
символ в файле
main /usr/local/lib/gcc-lib/sparc-sun-solaris2.7/2.95.2/crt1.o
ld: критическое: Ошибки символьных обращений. В файл a.out ничего не записано
collect2: ld вернул статус выхода 1 ]
Gcc встретил что-то похожее на вызов функции, но функции с таким именем не существует. Имя «отсутствующей» функции — это первое слово в третьей строке сообщения об ошибке (main).
Во всех Си-программах должна существовать функция main, поскольку именно с неё начинается исполнение программы.
character constant too long [слишком длинная символьная константа]
В Си строки должны заключаться в двойные кавычки («»
. Если вы используете одинарные кавычки (»), ожидается, что в них будет только один символ (или управляющая последовательность).
warning: passing arg n of ‘function’ makes
pointer from integer without a cast [передаваемый аргумент n функции ‘function’ создаёт указатель из целого без приведения]
Вы вызвали функцию function. Ожидается, что аргумент n будет указателем, но вы передаёте в функцию целое значение (int). Для изменения типа значения используется приведение типов, но у вас этого нет. Си — это типизированный язык, то есть требуется объявлять типы переменных и типы данных, передаваемых функциям, перед началом их использования. Данное предупреждение выводится, если встречено несоответствие типов между данными, передаваемыми в функцию, и данными, ожидаемыми функцией (тип передаваемых
параметров указывается в прототипе функции). Несмотря на то что gcc создаст объектный код, на это предупреждение стоит обратить внимание, так как оно обычно указывает на логическую ошибку.
unterminated string or character constant [незавершённая строка или символьная константа]
Не совпадает число открывающих и закрывающих кавычек (одинарных или двойных).
parse error at end of input [ошибка разбора в конце ввода]
Вы, возможно, потеряли закрывающую фигурную скобку (}) где-то в коде. Си не может сказать, где именно, так что удачи в поисках!
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 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
#include <windows.h> #include <tchar.h> #define DIB_RGB(r, g, b) ((DWORD)((r & 0xFF) << 16) | ((g & 0xFF) << 8) | (b & 0xFF)) void fill_rect(__int32*, int, int, int, int, int, DWORD); // 24/32 бит BOOL SaveArrFile(const TCHAR* filename, const __int32* arr, int width, int height, int bpp = 24){ if((bpp < 24) || (bpp > 32)) // только 24/32 бит return FALSE; DWORD p_row = (DWORD)((width * bpp + 31) & ~31) / 8uL; DWORD size = (DWORD)(height * p_row); // формируем файловый заголовок BITMAPFILEHEADER hdr; ZeroMemory(&hdr, sizeof(BITMAPFILEHEADER)); hdr.bfType = 0x4D42; hdr.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); hdr.bfSize = hdr.bfOffBits + size; // заголовок описателя растра BITMAPINFO dib; ZeroMemory(&dib, sizeof(BITMAPINFO)); dib.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); dib.bmiHeader.biBitCount = bpp; dib.bmiHeader.biCompression = BI_RGB; dib.bmiHeader.biPlanes = 1u; dib.bmiHeader.biWidth = (long)width; dib.bmiHeader.biHeight = (long)-height; dib.bmiHeader.biSizeImage = size; dib.bmiHeader.biXPelsPerMeter = 11811L; dib.bmiHeader.biYPelsPerMeter = 11811L; dib.bmiHeader.biClrImportant = 0uL; dib.bmiHeader.biClrUsed = 0uL; // далее запись в файл HANDLE fp = CreateFile(filename, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(fp == INVALID_HANDLE_VALUE) return FALSE; // записываем заголовки... DWORD dwr = 0uL; WriteFile(fp, (LPCVOID)&hdr, sizeof(BITMAPFILEHEADER), &dwr, NULL); WriteFile(fp, (LPCVOID)&dib.bmiHeader, sizeof(BITMAPINFOHEADER), &dwr, NULL); // запись массива пикселей if(bpp == 32) // 32-бит WriteFile(fp, (LPCVOID)arr, size, &dwr, NULL); else if(bpp == 24) { // 24-бит с дополнением до 32-разрядной границы BYTE nil = 0u; int cb = sizeof(RGBQUAD); int align = ((cb - ((width*bpp + 7) / 8) % cb) % cb); for(int y = 0; y < height; y++) { for(int x = 0; x < width; x++) WriteFile(fp, (LPCVOID)&arr[y*width+x], sizeof(RGBTRIPLE), &dwr, NULL); for(int i = 0; i < align; i++) // до границы DWORD WriteFile(fp, (LPCVOID)&nil, sizeof(BYTE), &dwr, NULL); } } FlushFileBuffers(fp); CloseHandle(fp); return TRUE; } int main(void) { //массив пикселей __int32 arr[111*222] = {0}; int cw = 222; int ch = 111; // нарисуем что-нибудь DWORD rgb; int sx = ch / 5; int sy = cw / 10; for(int y = 0; y < 5; y++) { for(int x = 0; x < 10; x++) { rgb = DIB_RGB(rand()%2*0xFF, rand()%2*0xFF, rand()%2*0xFF); fill_rect(arr, cw, x*sx, y*sy, sx, sy, rgb); } } // сохраняем в файл if(SaveArrFile(_T("grid.bmp"), arr, cw, ch, 24)) _putts(_T("Good save file.")); else _putts(_T("Error save file !")); _gettchar(); return 0; } // вывод прямоугольника void fill_rect(__int32* arr, int width, int x, int y, int cx, int cy, DWORD color){ for(int r = y; r <= (y + cy); r++) { for(int c = x; c <= (x + cx); c++) arr[r*width + c] = color; } } |
-
07-02-2013
#1

Registered User
‘a’ undeclared (first use in this function) Error
Hello Programmers, I am trying to make a program that will allow a user to enter their name, from this point, three options should be present for the user to choose, then from that point, two more options should be present. I have if else statements in a switch case and I get the «undeclared» error for the a in the first » if(specificage == a) «. Does anyone know the fix to this, it is the only error I get. I’m new to programming, sorry if I sound like a rookie. Run it if you need, thanks!

NOTE: I use Code::Blocks.Here is the code:
Code:
#include <stdio.h> #include <string.h> int main() { char name[50]; char ageclass[50]; char specificage[50]; printf("Please enter your name: "); fgets(name, 50, stdin); printf("Hello %s", name); printf("Are you a:n"); printf("1. Minorn"); printf("2. Adultn"); printf("3. Senior Citizenn"); printf("Answer(1, 2, or 3): "); fgets(ageclass, 50, stdin); switch (ageclass[50]) { case'1': { printf("You are between the ages of:n"); printf("a. 0-12n"); printf("b. 13-18n"); printf("Answer(a or b): "); fgets(specificage, 50, stdin); if(specificage == a) { printf("You are a young minor."); } else { printf("You are an older minor."); } } case'2': { printf("You are between the ages of:n"); printf("a. 19-50n"); printf("b. 51-65n"); printf("Answer(a or b): "); fgets(specificage, 50, stdin); if(specificage == a) { printf("You are a young adult."); } else { printf("You are an older adult."); } } case'3': { printf("You are between the ages of:n"); printf("a. 66-90n"); printf("b. 91-110n"); printf("Answer(a or b): "); fgets(specificage, 50, stdin); if(specificage == a) { printf("You are a young senior citizen."); } else { printf("You are an older senior citizen."); } } } getchar(); return 0; }Last edited by critixal; 07-02-2013 at 05:49 PM.
-
07-02-2013
#2

Registered User
Don’t reply, issue resolved!
-
07-02-2013
#3

Registered User
You have two problems. First
Code:
if(specificage == a)
a here is treated as a variable. If you want to check that the user input the letter a, you need to put single quotes around it: ‘a’. If you want a string containing one character, the letter a, use double quotes: «a»
Second, specificage is a char array/string. You can’t compare strings with ==. You can compare individual characters in the string/array with ==, or use strcmp/strncmp:
Code:
if (strcmp(specificage, "some string") == 0) // strcmp returns 0 if they're equal // or if (specificage[3] == 'q') // check that the 4th (remember, arrays in C start at 0) character is a 'q'
I’m guessing you were more interested in the second example.
Two more notes:
1. fgets leaves the newline character (remember, the user pressed enter after ‘a’ or ‘b’). If I enter «foo» followed by enter, the string fgets gives back contains «foon». If you do strcmp, it will not match «foo», since the n is significant. If you need to get rid of it, use the strchr trick here: FAQ > Get a line of text from the user/keyboard (C) — Cprogramming.com.
2. The user may enter uppercase ‘A’ or ‘B’ for some reason, your program should handle it. Easy enough, use the toupper() or tolower() functions before comparing (remember to #include <ctype.h>)
-
07-02-2013
#4

Registered User
Originally Posted by anduril462
You have two problems. First
Code:
if(specificage == a)
a here is treated as a variable. If you want to check that the user input the letter a, you need to put single quotes around it: ‘a’. If you want a string containing one character, the letter a, use double quotes: «a»
Second, specificage is a char array/string. You can’t compare strings with ==. You can compare individual characters in the string/array with ==, or use strcmp/strncmp:
Code:
if (strcmp(specificage, "some string") == 0) // strcmp returns 0 if they're equal // or if (specificage[3] == 'q') // check that the 4th (remember, arrays in C start at 0) character is a 'q'
I’m guessing you were more interested in the second example.
Two more notes:
1. fgets leaves the newline character (remember, the user pressed enter after ‘a’ or ‘b’). If I enter «foo» followed by enter, the string fgets gives back contains «foon». If you do strcmp, it will not match «foo», since the n is significant. If you need to get rid of it, use the strchr trick here: FAQ > Get a line of text from the user/keyboard (C) — Cprogramming.com.
2. The user may enter uppercase ‘A’ or ‘B’ for some reason, your program should handle it. Easy enough, use the toupper() or tolower() functions before comparing (remember to #include <ctype.h>)Oh, actually this helped a lot, I will make these changes, thank you tons!
Could you check out my other post, the more recent one, thanks! It involves the same program.Last edited by critixal; 07-02-2013 at 06:33 PM.
Что такое необъявленные ошибки идентификатора? Каковы общие причины и как их исправить?
Пример текстов ошибок:
- Для компилятора 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
|
|
|||||||||||||
|
