Nick Heiner
Nick Heiner

Reputation: 122630

Microsoft C Compiler: Inline variable declaration?

I'm writing C in Visual Studio 2010. The compiler doesn't seem to want to let me use inline variable declarations. The following code produces an error:

unsigned int fibonacci_iterative(unsigned int n) {
 if (n == 0) {
  return 0;
 }
 if (n == 1) {
  return 1;
 }

 unsigned int prev_prev = 0; // error
 unsigned int prev = 1; // error
 unsigned int next = 0; // error
 for (int term_number = 0; term_number < n; term_number++) {
  unsigned int temp = prev_prev + prev;
  prev = next;
  prev_prev = prev;
  next = temp;
 }
 
 return next;
}

Error:

error C2143: syntax error : missing ';' before 'type'

error C2143: syntax error : missing ';' before 'type'

error C2143: syntax error : missing ';' before 'type'

Why is this happening? Is there a setting to make the compiler not so strict?

Upvotes: 11

Views: 4709

Answers (3)

jamesdlin
jamesdlin

Reputation: 90174

Putting declarations after non-declarations isn't allowed in C89, although it is allowed in C++ and in C99 (MSVC still doesn't support C99, though).

In C89, you can achieve a similar effect by using a nested block:

unsigned int fibonacci_iterative(unsigned int n) {
    if (...) {
    }

    {
       unsigned int prev_prev = 0;
       unsigned int prev = 1;
       unsigned int next = 0;
       ...
    }
 }

Upvotes: 10

Chinmay Kanchi
Chinmay Kanchi

Reputation: 66073

Inline variable declarations are only supported in a C99 compliant compiler. Microsoft Visual C++ doesn't seem to be C99-compliant (ref). You're either going to have to use a C99-compliant compiler (GCC will compile code with inline variables when used with -std=c99) or declare your variables at the top of the function.

EDIT: Or try C++ mode, as suggested by akallio, though C and C++ aren't strictly compatible with each other, so if (for example), you use any C++-specific keywords in your C code, it won't compile.

Upvotes: 1

Arthur Kalliokoski
Arthur Kalliokoski

Reputation: 1647

Try to compile it as C++. C99 will allow variables to be declared other than the top of scope, but VC doesn't know about C99.

Upvotes: 1

Related Questions