2010-11-02 34 views
9

Nếu tôi có đoạn mã sau:Phạm vi biến trong C++

for(int myvar = 0; myvar < 10; myvar++); 
if(1) 
{ 
    int var2 = 16; 
} 

Sau đó, sau đó tôi đã viết như sau:

myvar = 0; 
var2 = 0; 

rằng sẽ là hợp pháp? VC++ 6 của tôi biên dịch chính xác, nhưng tôi nghĩ điều này là bất hợp pháp. (Nó đưa ra một lỗi biên dịch thuộc một trong các trình biên dịch khác của tôi.)

+4

"VC + 6 của tôi biên dịch chính xác," không có. – avakar

+0

@all câu trả lời, tôi có VC++ 6 chỉ trên một máy tính; mặt khác, tôi có VC++ 2008EE. Tôi buộc phải sử dụng VC++ 6. :) –

Trả lời

10

VC6 là khá cũ, và không phải lúc nào ... cứng nhắc ... trong ứng dụng của tiêu chuẩn :-) Nó thực sự bị rò rỉ phạm vi trong những trường hợp nhất định như:

for (int i = 0; i < 10; i++) { } 
// You can still use 'i' here. 

Điều này dẫn đến một số funky macro magic để khắc phục sự cố này. Nếu bạn đang sử dụng trình biên dịch tuân thủ ISO, cả hai thứ bạn cố gắng làm là bất hợp pháp.

Từ ISO C++ 11 3.3.3/1, đối phó với sự ra đời của phạm vi khối với {...}:

Một tên tuyên bố trong một khối là địa phương để khối đó; nó có phạm vi khối. Phạm vi tiềm năng của nó bắt đầu tại thời điểm khai báo và kết thúc vào cuối khối của nó.

Mục 6.5.3 bao gồm phạm vi của các biến "tạo ra" bởi một tuyên bố for:

Nếu for-init-statement là một tuyên bố, phạm vi của tên (s) tuyên bố kéo dài đến cuối for-statement .

+1

Tôi nghĩ bạn có nghĩa là C++ 0x. –

17

Không, nó sẽ không được (§3.3.2 phạm vi địa phương):

  1. Một tên tuyên bố trong một khối (6.3) là cục bộ cho khối đó. Phạm vi tiềm năng của nó bắt đầu tại thời điểm khai báo (3.3.1) và kết thúc tại số kết thúc khu vực khai báo của nó.

Tôi khuyên bạn nên sử dụng trình biên dịch được phát hành trong thập kỷ qua.

1

Điều đó có hợp pháp không? VC++ 6 của tôi biên dịch nó một cách chính xác, nhưng tôi nghĩ điều này là bất hợp pháp.

Không cần phải hợp pháp. Dump VC++ 6. Sử dụng trình biên dịch mới và tốt hơn.

1

VC mất khoảng một thập kỷ để thực hiện phạm vi thích hợp cho các biến được khai báo trong vòng lặp và báo cáo có điều kiện. Nói chung bạn không thể dựa vào phán quyết của VC6 về C++.

4

Điều đó là bất hợp pháp nhưng VC6 rất xấu.

Trong Visual Studio 2005, một cài đặt cấp dự án mới đã được giới thiệu có tên "Buộc tuân thủ trong phạm vi vòng lặp".Điều này giải quyết vấn đề và cung cấp khả năng tương thích ngược. Điều này có nghĩa là các cơ sở mã cũ hơn có thể biên dịch trong các phiên bản mới hơn của studio trực quan thông qua việc tắt cài đặt này.

Tuy nhiên, một điều mà MS đã làm đúng trong VS2005 để bật tính năng này theo mặc định do đó, đến gần hơn một chút so với tiêu chuẩn.