In C all variable names have to be declared before they are used. If you try to use the name of a variable or a function that hasn't been declared you will get an "undeclared identifier" error.

  • You issue deals with scoping. To fix your issue you need to declare the variable height before the while lope.

Your code should be the following:

int height;
  do {
    height = Getint();
} while (some condition);
Answer from Christopher Clarke on Stack Exchange
🌐
Reddit
reddit.com › r/learnprogramming › [c] getting a "error: use of undeclared identifier c" when calling function even though it's declared.
r/learnprogramming on Reddit: [C] Getting a "error: use of undeclared identifier c" when calling function even though it's declared.
March 31, 2017 -

Hello, I'm new to programming and while coding my example program I ran into an issue that I've been trying to figure out how to resolve. When print_Menu_Info(); executes and it tries to execute print_Customer_Table(&c); I encounter the error in the title.

sales.c:101:24: error: use of undeclared identifier 'c'

Even though the line is being declared in line 12.

struct customer c = empty_customer;

#include <stdio.h>
#include <stdlib.h>
#include "sales.h"

int main(void)
{
    menu_update();
    return 0;
}

void menu_update(void){
    struct customer c = empty_customer;
	float f = 0.00;
	int i = 0;
	while (1) {
	    cls();
	    print_Menu_Info();
	    switch(get_User_Input()){
	        case 1:
				printf("Customer First Name: ");
				scanf("%s",c.first_Name);
	            break;
	        case 2:
				printf("Customer Last Name: ");
				scanf("%s",c.last_Name);
	            break;
	        case 3:
				printf("Customer Amount: ");
				scanf("%f",&f);
				c.amount = f;
	            break;
	        case 4:
				printf("Customer Card Number: ");
				scanf("%s",c.card_Number);
	            break;        
	        case 5:
				printf("Customer Card Expiration Month: ");
				scanf("%i",&i);
				c.card_Expiration_Month = i;
	            break;
	        case 6:
				printf("Customer Card Expiration Year: ");
				scanf("%i",&i);
				c.card_Expiration_Year = i;
	            break;
	        case 7:
				printf("Sales Person: ");
				scanf("%s",c.sales_Person);
	            break;
            case 8:
                print_Customer_Table(&c);
                break;
            case 9:
                c = empty_customer;
                break;
	        case 10:
	            exit(0);
	        default:
	            printf("Incorrect action ID!\n");
	            break;
	    }    
	}
}

void cls(void){
    printf("\033c");
}

int get_User_Input(){
	int a = 0;
    char line[32];
    printf("Please input an action ID: ");
	if (fgets(line, sizeof(line), stdin) != NULL) {
    	sscanf(line, "%i", &a);
    	cls();
    }
	return a;
}


void print_Customer_Table(struct customer *cp){
    printf(
    "1. Customer First Name: %s\n"
    "2. Customer Last Name: %s\n"
    "3. Customer Amount: $%.2f\n"
    "4. Customer Card Number: %s\n"
    "5. Customer Card Expiration Month: %i\n"
    "6. Customer Card Expiration Year: %i\n"
    "7. Sales Person: %s\n",
    cp->first_Name,
    cp->last_Name,
    cp->amount,
    cp->card_Number,
    cp->card_Expiration_Month,
    cp->card_Expiration_Year,
    cp->sales_Person);
}

void print_Menu_Info(void){
	print_Customer_Table(&c);
	printf(
	"If you would like to update a value type the value you would like to update(1-7)\n"
    "If you would like to send this as a email type 8\n"
    "If you would like to clear all customer data type 9\n"
    "If you would like to exit this program type 10\n");
}                

and sales.h

#define NAME_LEN_MAX 128
#define CARD_NUM_LEN_MAX 16
struct customer {
    char first_Name[NAME_LEN_MAX + 1];
    char last_Name[NAME_LEN_MAX + 1];
    float amount;
    char card_Number[CARD_NUM_LEN_MAX + 1];
    int card_Expiration_Month;
    int card_Expiration_Year;
    char sales_Person[NAME_LEN_MAX + 1];
};
const static struct customer empty_customer = {{""},{""},0.00,{""},0,0,{""}};
void print_Customer_Table(struct customer *cp);
void print_Menu_Info(void);
void cls(void);
int get_User_Input();
void menu_update(void);
🌐
LabEx
labex.io › tutorials › c-how-to-fix-undeclared-identifier-in-c-419180
How to fix undeclared identifier in C | LabEx
In C programming, one of the most common errors beginners encounter is the "undeclared identifier" error. This error occurs when you try to use a variable, function, or type that the compiler cannot find a declaration for.
🌐
Reddit
reddit.com › r/cs50 › "use of undeclared identifier" error for loops (in c)
r/cs50 on Reddit: "Use of undeclared identifier" error FOR loops (in C)
November 18, 2020 -

Hi CS50 gang!

I'm really enjoying the course, but my brain hurts already at week 2. I've noticed an error when compiling a programme in C when I try to declare a variable inside a FOR loop in C (example below).

I just move my variable declaration to above the FOR loop, but I have two questions about this:

  1. Why does this happen? Is it because the loop tries to declare the variable each time it iterates?

  2. Does it cause problems to declare the variable (int letter_count) above the loop, like I have done in the example below? Or is there a better convention for declaring variables?

 int letter_count = 0;
    //loop to break text string into chars
    for (int i = 0, n = strlen(text); i < n; i++)
    {
        //check if char i is lower or upper and increment letter-count by 1 if true
        if (isupper(text[i]) || islower(text[i]))
        {
            letter_count++;
        }
        
        printf("%c", text[i]);
    }

Thank you!

🌐
Coderanch
coderanch.com › t › 737485 › languages › undeclared-identifier-declared
Use of undeclared identifier that is declared (C / C++ forum at Coderanch)
December 15, 2020 - So I would expect to see it being used in something like: where obj is a variable of class Parse. You are calling it as if it's a 'normal' function, not a method, and there isn't one called parseName. ... Thank you very much John, that was my problem. I had to take it outside of the class.
Top answer
1 of 2
5

The problem is the semicolon on line 138:

for (int column = 0; column < d - 1; column++);

In C, a semicolon is used to terminate a statement. The body of the for loop (the part in curly braces) is part of the loop statement. If you add a semicolon after the declaration, but before the curly braces, the compiler considers the loop statement to be terminated before the body even starts, producing the for loop has empty body warning.

Now, the loop variable column that you declared in line 138 is only in-scope during the body of the loop. Since you accidentally terminated the loop before giving it a body, column leaves scope immediately after the declaration on line 138. Since you haven't previously declared column in the scope outside of the loop, you get the use of undeclared identifier error.

If you delete the semicolon from the end of line 138 it should fix at least two of those errors; since row is also raising an error, it's likely you have the same problem in an earlier loop declaration. In general, you don't need to use semicolons after for loop declarations or body blocks in C. You only need them in the declaration itself and on the individual statements inside the body. Like this:

for (int i = 0; i < 5; i++)
{
    printf('%i\n', i);
}

Notice there is no semicolon at the end of the loop declaration or after the curly brace that closes the loop body.

2 of 2
1

The above user has identified the syntax errors in your code and also explained the reason.Here is some more info on the error:

Most of the time use of an undeclared identifier error occurs when you try to use a variable without first declaring it. To declare a variable one must write its type followed by its name (also known as identifier). Once you've declared it, only then you are allowed to use it in expressions or assignments.For example:

    int num; //variable declaration
    num=10;

The above code will not give an error but if you skip the declaration part,most probably the compiler will through a use of an undeclared identifier error.

Another way this error pops up is when you try to access a variable outside the block(a piece of code written between curly braces { } ) where it was originally defined.This is the case when you define a variable in a function body or a loop body and try to access it outside the loop or function.

Here, the compiler will throw an error because for it these variables cease to exist once the block has executed.Such variables are called local variables.The code outside their respective block is said to be outside of their scope. You can read more about this when you study C-Scope rules.Here's a useful link on Scope rules in C: http://www.geeksforgeeks.org/scope-rules-in-c/

🌐
Stack Overflow
stackoverflow.com › questions › 70988273 › cs50-how-to-fix-error-use-of-undeclared-identifier-i
c - CS50 How to fix error: use of undeclared identifier 'i'? - Stack Overflow
February 4, 2022 - Note for OP... with for (int i = ...) { ... } the variable i ceases to exist at the last }. If want to reuse the name you need to re-define it. ... "use of undeclared identifier 'i'" means that you have not declared the identifier i before using it ...
🌐
GeeksforGeeks
geeksforgeeks.org › c language › how-to-avoid-compile-error-while-defining-variables
How to avoid Compile Error while defining Variables - GeeksforGeeks
April 5, 2019 - Like C/C++, in Java, all identifiers are lexically (or statically) scoped, i.e.scope of a variable can be determined at compile time and independent of the function call stack. Example: ... prog.c: In function 'main': prog.c:5:18: error: 'x' undeclared (first use in this function) printf("%d", x); ^ prog.c:5:18: note: each undeclared identifier is reported only once for each function it appears in How to Correct the above code: Declare the variable x before using it in the outer scope.
Find elsewhere
🌐
Cplusplus
cplusplus.com › forum › general › 168763
Error "use of undeclared identifier" - C++ Forum
July 3, 2015 - When you declare a variable in ... is showing the error "undeclared identifier" In this case, you should declare "double balance" in your header file so that any other function can use that variable....
🌐
Intel Community
community.intel.com › t5 › Intel-oneAPI-DPC-C-Compiler › use-of-undeclared-identifier-cl-error-in-example-set › td-p › 1464745
Solved: use of undeclared identifier 'cl' error in example set - Intel Community
March 23, 2023 - Scanning dependencies of target openmp_reduction make[2]: Leaving directory '/home/u187665/oneAPI-samples/DirectProgramming/C++/ParallelPatterns/openmp_reduction/build' make -f src/CMakeFiles/openmp_reduction.dir/build.make src/CMakeFiles/openmp_reduction.dir/build make[2]: Entering directory '/home/u187665/oneAPI-samples/DirectProgramming/C++/ParallelPatterns/openmp_reduction/build' [ 50%] Building CXX object src/CMakeFiles/openmp_reduction.dir/main.cpp.o cd /home/u187665/oneAPI-samples/DirectProgramming/C++/ParallelPatterns/openmp_reduction/build/src && /glob/development-tools/versions/oneap
🌐
Quora
quora.com › Why-am-I-getting-an-error-use-of-undeclared-identifier-len
Why am I getting an error: use of undeclared identifier 'len'? - Quora
Answer (1 of 3): I pasted your source code below: [code]#include #include #include #include #include int getletterlength(string text); int main(void){ string text=get_string("Text: "); printf("%d\n", getletterlength(text)); { return 0; } } int ...
🌐
Reddit
reddit.com › r/cpp_questions › why am i getting "use of undeclared identifier function()" error?
Why am I getting "use of undeclared identifier function()" error? : r/cpp_questions
June 11, 2018 - printf comes from the C standard library and so %s makes it expect a C string (char* not a C++ one (string). You probably want to be using iostreams here instead of C I/O.
Top answer
1 of 13
109

They most often come from forgetting to include the header file that contains the function declaration, for example, this program will give an 'undeclared identifier' error:

Missing header

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

To fix it, we must include the header:

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

If you wrote the header and included it correctly, the header may contain the wrong include guard.

To read more, see http://msdn.microsoft.com/en-us/library/aa229215(v=vs.60).aspx.

Misspelled variable

Another common source of beginner's error occur when you misspelled a variable:

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

Incorrect scope

For example, this code would give an error, because you need to use std::string:

#include <string>

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

Use before declaration

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

g has not been declared before its first use. To fix it, either move the definition of g before f:

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

Or add a declaration of g before f:

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

stdafx.h not on top (VS-specific)

This is Visual Studio-specific. In VS, you need to add #include "stdafx.h" before any code. Code before it is ignored by the compiler, so if you have this:

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

The #include <iostream> would be ignored. You need to move it below:

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

Feel free to edit this answer.

2 of 13
21

Consider a similar situation in conversation. Imagine your friend says to you, "Bob is coming over for dinner," and you have no idea who Bob is. You're going to be confused, right? Your friend should have said, "I have a work colleague called Bob. Bob is coming over for dinner." Now Bob has been declared and you know who your friend is talking about.

The compiler emits an 'undeclared identifier' error when you have attempted to use some identifier (what would be the name of a function, variable, class, etc.) and the compiler has not seen a declaration for it. That is, the compiler has no idea what you are referring to because it hasn't seen it before.

If you get such an error in C or C++, it means that you haven't told the compiler about the thing you are trying to use. Declarations are often found in header files, so it likely means that you haven't included the appropriate header. Of course, it may be that you just haven't remembered to declare the entity at all.

Some compilers give more specific errors depending on the context. For example, attempting to compile X x; where the type X has not been declared with clang will tell you "unknown type name X". This is much more useful because you know it's trying to interpret X as a type. However, if you have int x = y;, where y is not yet declared, it will tell you "use of undeclared identifier y" because there is some ambiguity about what exactly y might represent.

Top answer
1 of 1
1

It's a scope issue. You're getting compile error because this code is trying to use an undeclared variable, num, to declare the size of a global variable array. num doesn't exist at all at this point:

int candidato[num][4];
int totalVotos[num];

It's a problem later too, because if you do successfully declare the size of the arrays, that size is fixed. There's no way to declare these arrays at the correct size because there's no way to predict how large they will be. All you can do is make a guess of what the maximum size would be, add some extra, just in case, and declare a fixed size. That's going to be either too small, or a waste of memory when it's too big, as well as an invitation to bugs.

Later, num only exists in the function(s) where it is declared. Also, when declared in different functions, each function contains a different version of variables with the same name and they're all unrelated. When I say 'functions', that also includes main().

So, the problem will reappear in main(). The var num is not declared in main, so it doesn't exist when the code tries to use it in the switch statement. It hasn't been declared and no value has been assigned to it.

Remember too, values in variables are passed by copy from main to the functions, or from function to function. That means that the variable in the calling function will remain unchanged, while the called function may or may not change the value in it's local version of the var.

The only way this isn't true is if the var is a global variable. But, well, see below.

Programming tip: This program has numerous global variables. It's a bad practice to use global variables unless absolutely necessary. With so many, I seriously doubt that this many (or perhaps any of them) are necessary. Global variables are an invitation to software bugs, especially when multiple functions are involved. You should try to eliminate using them as globals and set them up as locals.

If this answers your question, please click on the check mark to accept. Let's keep up on forum maintenance. ;-)

🌐
CERN
root-forum.cern.ch › newbie
Error : use of undeclared identifier - Newbie - ROOT Forum
November 23, 2021 - ROOT Version : 6.24/06 Hello guys, I am having a problem which is pretty weird. Here is my code : Int_t ind_run = 0; if(ind_run==0){ TString path = "/home/marius/Documents/Thèse/E819S/Copie/Histogrammes/single/8He-12micrA-sansRED_0001_single_out.root"; } else if(ind_run == 1){ TString path = "/home/marius/Documents/Thèse/E819S/Copie/Histogrammes/single/8He-10uA-sansRED-RUN1_0001_single_out.root"; } else if(ind_run == 2){ TString path = "/home/marius/Documents/Thè...
🌐
Reddit
reddit.com › r/learnprogramming › undeclared identifier is in fact, declared?
r/learnprogramming on Reddit: Undeclared identifier is in fact, declared?
May 4, 2023 -

Hi,

So I'm very new to programming and am currently undertaking the Harvard CS50 course. Attempting lab 2, I have come across the following error:

scrabble.c:17:34: error: use of undeclared identifier 'word'

for (int i = 0, len = strlen(word); i < len; i++)

This error is confusing the heck out of me, as there are lines of code beneath this one that are unaffected.

The top of my code (prior to line 17) introduces the identifier as int compute_score(string word);. But for some reason, the "word" on line 17 is unaffected by the declaration, while lines of code beneath it that also include "word" are colored orange correspondingly. The "word" on line 17 is for some reason, uncolored.

Sorry if this makes little sense, half asleep trying to do this and am beating myself up a bit.

Thanks.