2010-03-25 37 views
12

Vì lý do nào đó Visual Studio 2008 của tôi bắt đầu hiển thị cảnh báo cho mã như: "int main (int argc, char ** argv)", điều này thực sự gây phiền nhiễu.Cách xử lý Cảnh báo C4100 trong Visual Studio 2008

Các ouputs cảnh báo chi tiết được (bạn có thể bỏ qua những con số dòng):
1> \ main.cpp (86):. Cảnh báo C4100: 'argv':. Unreferenced tham số chính thức
1> \ main.cpp (86): cảnh báo C4100: 'argc': tham số chính thức không được tham chiếu

Tôi tự hỏi nếu có cài đặt trong Visual Studio 2008 đã bị vô tình thay đổi. Hoặc làm thế nào tôi nên đối phó với cảnh báo này?

Trả lời

18

Nếu các thông số là unreferenced, bạn có thể để họ giấu tên:

int main(int, char**) 
{ 
} 

thay vì

int main(int argc, char** argv) 
{ 
} 

Nếu bạn thực sự muốn chỉ để ngăn chặn cảnh báo, bạn có thể làm như vậy bằng cách sử dụng lệnh /wd4100 tùy chọn dòng cho trình biên dịch hoặc sử dụng #pragma warning(disable: 4100) trong mã của bạn.

Đây là cảnh báo mức 4; nếu bạn biên dịch ở mức cảnh báo thấp hơn, bạn sẽ không nhận được cảnh báo này. Mức cảnh báo được đặt trong thuộc tính dự án (nhấn chuột phải vào dự án, chọn Properties; trên thuộc tính Configuration -> C++ -> General, đặt "Warning Level").

+0

Có cài đặt nào trong VS2008 mà tôi có thể chơi không? Bởi vì đối với mã tôi đã viết trước đó, cảnh báo C4100 này không hiển thị với tôi biên dịch chúng.Cảm ơn bạn. – Jimmie

+0

@Jimmie: Có; bạn có thể thay đổi mức cảnh báo cho dự án của mình thành một mức cảnh báo thấp hơn (ví dụ: mức 3). –

+3

Lưu ý rằng có các tham số chưa được đặt tên trong định nghĩa hàm là OK trong C++, nhưng nếu biên dịch của bạn là C thì đó là một lỗi (một kích thích nhỏ đôi khi khi cố viết mã biên dịch theo một trong hai cách). –

4

Cảnh báo C4100 được phát hành ở mức cảnh báo 4 không phải là mặc định, vì vậy tại một số thời điểm ai đó có thể đã thay đổi nó cho dự án của bạn.

Bạn có thể thay đổi mức cảnh báo trở lại hoặc giải quyết cảnh báo trực tiếp hơn.

James McNellis said, bạn có thể tắt tiếng cảnh báo trong C++ bằng cách xóa tên tham số khỏi danh sách tham số. Tuy nhiên, nếu mã sẽ được biên dịch thành mã C, bạn sẽ gặp lỗi trong trường hợp đó.

Tiêu đề Windows xác định macro UNREFERENCED_PARAMETER() để giúp giải quyết cảnh báo này. Bạn có thể sử dụng

UNREFERENCED_PARAMETER(argc); 
UNREFERENCED_PARAMETER(argv); 

để tắt tiếng cảnh báo. Nếu bạn không muốn bao gồm tiêu đề cửa sổ, macro chỉ đơn giản là mở rộng đến việc sử dụng tên thông số trong biểu thức không làm gì:

#define UNREFERENCED_PARAMETER(P)   \ 
    /*lint -save -e527 -e530 */ \ 
    { \ 
     (P) = (P); \ 
    } \ 
    /*lint -restore */ 
+2

Tôi không biết về 'UNREFERENCED_PARAMETER'; đó là điều tốt để biết. Trong các tiêu đề Windows, có hai phiên bản. Cái được kích hoạt theo mặc định chỉ đơn giản là mở rộng thành '(P)'. Một cái khác, mà bạn trích dẫn, mở rộng thành '(P) = (P);', và được sử dụng nếu 'lint' được định nghĩa; điều này sẽ thất bại đối với các tham số của các loại có đủ điều kiện hoặc không thể phân loại. –

+0

@James - định nghĩa phức tạp hơn chỉ là những gì ctags nhảy của tôi đã xảy ra với đất trên (tôi nên đã cuộn lên một chút - đặc biệt là kể từ khi tôi là một chút ngạc nhiên rằng việc mở rộng không chỉ là '(P)'). –

5

Nếu bạn không sử dụng tham số dòng lệnh thì chữ ký chuẩn khác cho chính là:

int main(); 
+0

Chữ ký chuẩn khác có khoảng trống giữa các dấu ngoặc đó, phải không? – paxdiablo

+3

Có, trong C; không có sự khác biệt trong C++ vì chúng tương đương nhau. Câu hỏi đã được gắn thẻ C++, vì vậy tôi đã đi với các hình thức không có params mà tôi thường sử dụng trong C + +. –

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