The convention in C is has generally been to declare all such local variables at the top of a function; this is different from the convention in C++ or Java, which encourage variables to be declared when they are first used.
Rules to Declare Variable in CVariables should not be declared with the same name in the same scope. A variable name can start with anything like the alphabet and underscore. But the variable name should not start with a number. A variable name must not be a reserved keyword in C.
The first one declares a variable of type char with the identifier c . The second is declares a variable of type int with the identifier area . The third one declares a variable of type float with the identifier num .
It's best to declare variables when you first use them to ensure that they are always initialized to some valid value and that their intended use is always apparent. The alternative is typically to declare all variables in one location, typically at the top of the block or, even worse, at the top of a function.
It compiles successfully because GCC allows the declaration of s
as a GNU extension, even though it's not part of the C89 or ANSI standard. If you want to adhere strictly to those standards, you must pass the -pedantic
flag.
The declaration of c
at the start of a { }
block is part of the C89 standard; the block doesn't have to be a function.
For C89, you must declare all of your variables at the beginning of a scope block.
So, your char c
declaration is valid as it is at the top of the for loop scope block. But, the char *s
declaration should be an error.
Grouping variable declarations at the top of the block is a legacy likely due to limitations of old, primitive C compilers. All modern languages recommend and sometimes even enforce the declaration of local variables at the latest point: where they're first initialized. Because this gets rid of the risk of using a random value by mistake. Separating declaration and initialization also prevents you from using "const" (or "final") when you could.
C++ unfortunately keeps accepting the old, top declaration way for backward compatibility with C (one C compatibility drag out of many others...) But C++ tries to move away from it:
C99 starts to move C in this same direction.
If you are worried of not finding where local variables are declared then it means you have a much bigger problem: the enclosing block is too long and should be split.
https://wiki.sei.cmu.edu/confluence/display/c/DCL19-C.+Minimize+the+scope+of+variables+and+functions
From a maintainability, rather than syntactic, standpoint, there are at least three trains of thought:
Declare all variables at the beginning of the function so they'll be in one place and you'll be able to see the comprehensive list at a glance.
Declare all variables as close as possible to the place they're first used, so you'll know why each is needed.
Declare all variables at the beginning of the innermost scope block, so they'll go out of scope as soon as possible and allow the compiler to optimize memory and tell you if you accidentally use them where you hadn't intended.
I generally prefer the first option, as I find the others often force me to hunt through code for the declarations. Defining all variables up front also makes it easier to initialize and watch them from a debugger.
I'll sometimes declare variables within a smaller scope block, but only for a Good Reason, of which I have very few. One example might be after a fork()
, to declare variables needed only by the child process. To me, this visual indicator is a helpful reminder of their purpose.
As noted by others, GCC is permissive in this regard (and possibly other compilers, depending on the arguments they're called with) even when in 'C89' mode, unless you use 'pedantic' checking. To be honest, there are not many good reasons to not have pedantic on; quality modern code should always compile without warnings (or very few where you know you are doing something specific that is suspicious to the compiler as a possible mistake), so if you cannot make your code compile with a pedantic setup it probably needs some attention.
C89 requires that variables be declared before any other statements within each scope, later standards permit declaration closer to use (which can be both more intuitive and more efficient), especially the simultaneous declaration and initialization of a loop control variable in 'for' loops.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With