2010-03-05 38 views
6

Tôi có một phần mã có thể được tóm tắt như sau;Tại sao mã sau không tạo cảnh báo trong MSVC

void MyFunc() 
{ 
    int x; 
' 
' 
    x; 
' 
' 
} 

Tôi đã nghĩ rằng chỉ đơn giản là tham chiếu một biến, mà không sửa đổi nó hoặc sử dụng giá trị của nó trong anyway sẽ tạo ra một cảnh báo. Trong VS2003 nó không phải, và tôi cần lint để nhặt nó lên.

Tôi nhận ra nó không ảnh hưởng đến thực thi, nhưng vì nó là một đoạn mã không làm gì cả, và lập trình viên không có ý định làm gì đó, tại sao nó không bị gắn cờ?

Tương tự như vậy, bạn mong đợi x = x là cảnh báo?

Chỉnh sửa: Câu hỏi đã sửa đổi, vì đây là một ứng cử viên tốt cho cảnh báo nhưng không phải là lỗi. Trả lời cho thấy điều này được xử lý tốt hơn với các trình biên dịch khác. Sẽ thử VS2008 sau và đăng kết quả.

+0

tại sao nó sẽ cung cấp cho một lỗi, cú pháp là chính xác. – Grumpy

+0

Có lẽ không phải là lỗi, nhưng chắc chắn là một cảnh báo. nếu (x = y) cũng có cú pháp chính xác, nhưng nói chung không phải là ý tưởng của lập trình viên.Tôi muốn nói bất kỳ mã nào có khả năng không phải lập trình viên dự định sẽ tạo ra cảnh báo, và tôi không thể thấy rằng thêm câu lệnh vào mã không có ý định của hầu hết các lập trình viên nhiều lần. –

Trả lời

1

Bạn cần phải sử dụng một trình biên dịch tốt hơn :-) Biên soạn với Wall và cờ -pedantic, GCC C++ biên dịch cho mã này:

int main() { 
    int x = 0; 
    x; 
} 

tạo chẩn đoán này:

ma.cpp:3: warning: statement has no effect 
+0

PC-Lint thực hiện tương tự đối với tôi, chỉ rất chậm;) lỗi 522: (Cảnh báo - Loại void dự kiến, gán, tăng hoặc decrement) Ngạc nhiên có bao nhiêu trong số này tôi đi qua linting một cơ sở mã lớn, tất cả các lỗi trong trường hợp này. –

+1

@Shane Nếu PC-Lint quá chậm, bạn có thể muốn điều tra GCC. Cổng MinGW (lấy phiên bản tại http://tdragon.net/recentgcc) sẽ biên dịch mã Windows một cách vui vẻ. –

1

Mã như vậy có thể xảy ra trong một lớp mẫu cho mục đích lập trình meta. Ví dụ, nó có thể là một số loại kiểm tra xem x có thể truy cập được từ ngữ cảnh hiện tại hay không. Có, nó không ảnh hưởng đến kết quả của việc thực hiện , nhưng nó ảnh hưởng đến kết quả của việc biên soạn ; điều này có thể trợ giúp cho các kỹ thuật như SFINAE.

Dường như, nó cũng không giúp biên soạn. Các cơ quan Funciton không tính để chọn mẫu thích hợp cho một cuộc gọi hàm. Và để kiểm tra khả năng truy cập trong phạm vi của một lớp, bạn phải sử dụng toán tử using cho các tên phụ thuộc; chính nhà điều hành using này là kiểm tra trợ năng.

Vì vậy, mã x; thực sự không có hiệu lực.

+0

@Pavel Shved, tôi không thấy quan điểm của bạn. Nếu 'x' không thể truy cập được từ ngữ cảnh hiện tại trong một bản mẫu, điều này dẫn đến lỗi biên dịch phải không? Mà nhịp SFINAE. –

+0

+1 để chỉnh sửa và kết luận. –

1

Bạn mong muốn một cảnh báo trừ khi bạn cast biểu thức để làm mất hiệu lực, ví dụ:

void MyFunc() 
{ 
    int x; 

    (void)x; 

} 

cảnh báo gì mức độ nào bạn đã thiết lập?

+0

/W4, mức cao nhất trong VS2003, yup tôi mong đợi một cảnh báo. (Khi ông dành một buổi sáng trwaling thông qua lint đầu ra). –

+0

'gcc -Wall' cho:' lint.c: 5: warning: statement không có hiệu lực' –

+0

ICC của Intel cho: 'lint.c (5): nhận xét # 174: biểu thức không có hiệu lực' và' lint.c (5): cảnh báo # 592: biến "x" được sử dụng trước khi giá trị của nó được đặt ' –

0

Cả hai đơn biến báo cáo (ví dụ như x;) và tự chuyển nhượng (như x = x) là mã hợp lệ trong C++, vì vậy trình biên dịch không thể đánh dấu chúng như các lỗi, nhưng một tốt trình biên dịch là tất nhiên được phép đưa ra một cảnh báo rằng họ không có bất kỳ hiệu ứng, và có thể là những sai lầm của các lập trình viên. Ví dụ, trình biên dịch g ++ đưa ra cảnh báo "tuyên bố không có hiệu lực" cho x;.

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