Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What are the signs of crosses initialization?

Consider the following code:

#include <iostream> using namespace std;  int main() {     int x, y, i;     cin >> x >> y >> i;     switch(i) {         case 1:             // int r = x + y; -- OK             int r = 1; // Failed to Compile             cout << r;             break;         case 2:             r = x - y;             cout << r;             break;     }; } 

G++ complains crosses initialization of 'int r'. My questions are:

  1. What is crosses initialization?
  2. Why do the first initializer x + y pass the compilation, but the latter failed?
  3. What are the problems of so-called crosses initialization?

I know I should use brackets to specify the scope of r, but I want to know why, for example why non-POD could not be defined in a multi-case switch statement.

like image 998
Jichao Avatar asked Mar 06 '10 13:03

Jichao


1 Answers

The version with int r = x + y; won't compile either.

The problem is that it is possible for r to come to scope without its initializer being executed. The code would compile fine if you removed the initializer completely (i.e. the line would read int r;).

The best thing you can do is to limit the scope of the variable. That way you'll satisfy both the compiler and the reader.

switch(i) { case 1:     {         int r = 1;         cout << r;     }     break; case 2:     {         int r = x - y;         cout << r;     }     break; }; 

The Standard says (6.7/3):

It is possible to transfer into a block, but not in a way that bypasses declarations with initialization. A program that jumps from a point where a local variable with automatic storage duration is not in scope to a point where it is in scope is ill-formed unless the variable has POD type (3.9) and is declared without an initializer (8.5).

like image 125
avakar Avatar answered Oct 06 '22 02:10

avakar