2012-10-09 26 views
89

tôi gần đây đã được sửa đổi một số mã, và tìm ra một lỗi tồn tại trước đó trên cùng một dòng trong một hàm:Điều gì sẽ 'std :;' làm trong c + +?

std:;string x = y; 

Mã này vẫn biên dịch và đã làm việc như mong đợi.

Định nghĩa chuỗi hoạt động vì tệp này là using namespace std;, do đó, std:: là không cần thiết ngay từ đầu.

Câu hỏi đặt ra là, tại sao là biên dịch std:; và điều gì sẽ xảy ra nếu có bất kỳ điều gì?

+1

@Xeo: Anh ấy nói trong câu hỏi anh ta có 'sử dụng không gian tên std;'. –

+0

@Fred: Derp! Phần đó không được đánh dấu là mã, vì vậy tôi chỉ bỏ qua nó. :) Tôi vẫn muốn trỏ đến [câu hỏi này] (http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-a-bad-practice-in-c), Tuy nhiên. – Xeo

+23

Cùng một lý do mà biên dịch 'http: // www.stackoverflow.com' ... –

Trả lời

90

std: nhãn của nó, có thể sử dụng làm mục tiêu cho goto.

Được chỉ định bởi @Adam Rosenfield trong nhận xét, đó là tên nhãn hợp pháp.

C++ 03 §6.1/1:

Nhãn có không gian tên riêng của họ và không ảnh hưởng đến định danh khác.

+0

Đây có phải là nhãn goto hợp pháp không? –

+0

@JohnDibling: Chắc chắn, tại sao không? –

+0

Dành riêng cho tiêu chuẩn? –

32

Đó là nhãn, theo sau là tuyên bố trống, tiếp theo là khai báo chuỗi x.

12

của một nhãn được tiếp theo là chuỗi

8
(expression)std: (end of expression); (another expression)string x = y; 
+4

Ngữ pháp-khôn ngoan, nó thực sự là một '(label-) statement', không phải là một' biểu thức'. – GManNickG

+0

Ồ vâng bạn đúng, có nghĩa là chúng được tách ra .. – Polymorphism

1

Trình biên dịch sẽ cho bạn biết những gì đang xảy ra:

#include <iostream> 
using namespace std; 
int main() { 
    std:;cout << "Hello!" << std::endl; 
} 

Cả gcc và kêu vang cho một cảnh báo khá rõ ràng:

std.cpp:4:3: warning: unused label 'std' [-Wunused-label] 
    std:;cout << "Hello!" << std::endl; 
    ^~~~ 
1 warning generated. 

Việc lấy ra khỏi câu chuyện này: luôn biên dịch mã của bạn bằng cảnh báo gs đã bật (ví dụ: -Wall).

Các vấn đề liên quan