Tôi đang làm việc trên một dự án C++ và tôi nhận thấy rằng chúng tôi có một số cảnh báo về các thông số không được sử dụng.Hậu quả của việc bỏ qua: cảnh báo: tham số không được sử dụng
Hiệu ứng có thể có nếu cảnh báo này bị bỏ qua?
Tôi đang làm việc trên một dự án C++ và tôi nhận thấy rằng chúng tôi có một số cảnh báo về các thông số không được sử dụng.Hậu quả của việc bỏ qua: cảnh báo: tham số không được sử dụng
Hiệu ứng có thể có nếu cảnh báo này bị bỏ qua?
Chức năng với một tham số không sử dụng có thể có một lỗi thực sự trong các trường hợp sau:
Có một đầu ra tham số , mà không được giao hoặc ghi vào, kết quả là giá trị không xác định cho người gọi.
Một trong các tham số là con trỏ hàm gọi lại, mà bạn phải gọi và quên làm như vậy. Có thể xảy ra nếu có rất nhiều #ifdef
s trong chức năng.
Bạn khai báo biến cục bộ có cùng tên đổ bóng một tham số và sau đó sử dụng giá trị sai trong hàm.
Không sử dụng một đầu vào thông số thể vô hại, nhưng bạn có thể làm giảm tiếng ồn để xem cảnh báo hữu ích bằng cách đánh dấu các thông số đầu vào chưa được sử dụng một cách rõ ràng trong phần đầu của hàm bằng cách đúc nó để void
(chỉ hoạt động cho cả C và C++):
(void)param1;
Hoặc,
#define UNUSED(expr) do { (void)(expr); } while (0)
...
void foo(int param1, int param2)
{
UNUSED(param2);
bar(param1);
}
Hoặc bỏ qua tên tham số (C++ chỉ):
void foo(int param1, int /*param2*/)
{
bar(param1);
}
Không có. ngoại trừ [EDIT]: như những người khác đã chỉ ra, Bạn có thể có một tham số đầu ra chưa được gán.
Bạn nên dọn dẹp chúng, vì nhiều lần tôi thấy các nhà phát triển bỏ qua những cảnh báo quan trọng bị 'ẩn' trong số lượng cảnh báo lớn, và họ đã quen với cảnh báo họ chưa bao giờ chú ý đến họ. Tôi cố gắng không có cảnh báo ở mọi thời điểm và đặt cảnh báo trình biên dịch ở mức tối đa.
Nếu bạn có rất nhiều cảnh báo không quan trọng không quan trọng đối với bạn, bạn có thể bỏ qua cảnh báo quan trọng về dòng mã bạn vừa viết đang ẩn ở giữa chúng.
Đây là lý do rất quan trọng để không bỏ qua cảnh báo. Có lẽ lý do quan trọng nhất. –
Điều đó có nghĩa là bạn đã viết một hàm lấy tham số nhưng không sử dụng tham số. Nó vô hại nhưng nó có thể chỉ ra lỗi trong một số trường hợp.
Nói chung, bạn có thể tắt tiếng cảnh báo này bằng cách xóa tên thông số, để ẩn tên, nhưng điều đó có thể không được mong muốn tùy thuộc vào lý do thông số không được sử dụng.
Tôi khuyên bạn nên tắt cảnh báo nếu việc này gây khó khăn hơn trong việc tìm ra các vấn đề thực sự.
Bạn có thể giải thích cách một tham số không được sử dụng có thể "... chỉ ra lỗi trong một số trường hợp." ?? –
int foo (int a, int b, int c) {thanh trả về (a) + thanh (a) + thanh (c); } // oops, mcopy & paste bug, nên gọi bar (b) – MSalters
Nếu một phương pháp không sử dụng một tham số thì câu hỏi đầu tiên phát sinh là tại sao là tham số mà một phần của chữ ký của phương pháp ở nơi đầu tiên.Những cảnh báo này có ý nghĩa vì nó là thiết kế xấu mà chúng đang đề cập đến và hơn thế nữa, có một chi phí nhỏ hơn bất cứ khi nào phương thức này được gọi, tham số này được đẩy lên ngăn xếp, tốt nhất là refactor phương thức và loại bỏ các thông số đó không có bất kỳ sử dụng nào.
Có nói rằng, để lại các thông số này không gây hại nhiều, ngoại trừ một chi phí nhỏ mà tôi đã đề cập.
Điều đó tùy thuộc vào việc bạn định sử dụng công cụ thông số. Ví dụ.
const int Size = 12; // intended for use in some other function
char* MakeBuffer(int size)
{
return new char[Size];
}
Trong mã 'kích thước' này không được sử dụng và thay vào đó 'Kích thước' liên tục đang được sử dụng. Vì vậy, cảnh báo sẽ làm nổi bật các vấn đề thuộc loại này cho bạn.
Tuy nhiên, nếu bạn không bao giờ thụt vào để sử dụng tham số thì nó chỉ cần được loại bỏ khỏi chữ ký phương thức. Trừ khi bạn cần phải phù hợp với một chữ ký cho một phương pháp ảo, hoặc con trỏ hàm, nếu đó là trường hợp thì bạn không có tùy chọn để loại bỏ nó.
Trong C++ bạn có thể có đối số mặc định:
int sum(int first, int second=0){ // should not give warning
return first+first;
}
Bạn cũng có thể có thêm đối số:
int sum(int first, int second){ // should give warning
first *= 2;
return first;
}
Nếu bạn có một tham số bạn không sử dụng và nó không mặc định, bạn sẽ nhận được một cảnh báo bởi vì bạn đang yêu cầu chương trình chuyển các giá trị thừa vào ngăn xếp không bao giờ được tham chiếu, và do đó làm việc nhiều hơn mức cần thiết.
Có thể điều đó có nghĩa là bạn cũng quên một phần của logic chức năng.
Tôi tin rằng các giá trị vẫn được chuyển đến chức năng nếu không có tham số chính thức. Không chỉ có tên địa phương để truy cập vào giá trị bằng. –
Tôi đang bối rối bởi ví dụ này - ngay cả với đối số mặc định, tại sao bạn muốn tham số thứ hai trong ví dụ đó? Có hay không bạn vượt qua một cái gì đó nó sẽ không bao giờ được sử dụng. Điều duy nhất tôi có thể nghĩ là nếu bạn không sử dụng nó ngay bây giờ nhưng bạn dự đoán API sẽ cần thông tin trong tương lai. –
Đối với một cách cụ thể gcc để vô hiệu hóa các cảnh báo, bạn có thể sử dụng __attribute__((unused))
như
void foo(int a, int b __attribute__((unused))) {
}
Để bỏ qua tham số thứ hai. Nếu chương trình của bạn dựa vào các công nghệ GCC, bạn có thể sử dụng thuộc tính đó để an toàn 100% so với loại cảnh báo đó.
Bằng cách này, cách tiếp cận với macro UNUSED được sử dụng trong thư viện Qt: nó có Q_UNUSED, giống hệt nhau, nhưng không có trình bao bọc 'do..while'. –
Thật vậy, nó trông giống như một thành ngữ phổ biến. Tôi đã nhìn thấy nó ở một vài nơi. –
Bạn có thể thêm một ví dụ về cách bỏ đi không? (Tôi đã thử nó và nó hoạt động, nhưng nó trông rất kỳ lạ Tôi không bao giờ nghĩ rằng nó sẽ biên dịch - và tôi chắc chắn những người khác cảm thấy như vậy.) –