2012-07-03 31 views
20

Nhiều lần khi tôi biên dịch một cái gì đó với lỗi đánh máy hoặc một số không khớp khác, tôi nhận được lỗi "tiêu chuẩn: không phù hợp cho 'functionname' in ...". Điều đó thật tuyệt. Sau đó, đặc biệt là trong trường hợp các hàm và toán tử quá tải, g ++ tiếp tục và liệt kê 10 trang của các ứng cử viên chỉ là các định nghĩa mẫu khổng lồ và ghê gớm.Vô hiệu hóa g + + "chú thích ứng cử viên là .." thông điệp trình biên dịch

Thông báo lỗi là tuyệt vời, nhưng có cách nào để vô hiệu hóa nó khỏi việc đề xuất các biến thể chức năng khác không?

+19

Chờ, bạn muốn thông báo lỗi có * thông tin * ít hơn? –

+7

Các định nghĩa chức năng mà nó gợi ý được ẩn đằng sau 10 lớp templating (đặc biệt là với boost) và làm cho nó khó khăn hơn nhiều để tìm nơi trình biên dịch thực sự xác định dòng với lỗi. Tôi muốn nó cho tôi biết lỗi ở đâu và có gì sai, nhưng tôi không thực sự cần nó để đề nghị cách sửa nó. – sshannin

+4

đường ống qua grep, chỉ khớp với các dòng có 'lỗi:' trong đó? FWIW môi trường phát triển của tôi đã 'nhảy vào dòng với lỗi' như một tính năng, mà như là một tiền thưởng thêm lá trên cùng của danh sách các ứng cử viên hiển thị trên màn hình. – Flexo

Trả lời

13

Theo như tôi biết, không có cờ tổng hợp trong GCC để vô hiệu hóa các ứng cử viên được đề xuất trong trường hợp các cuộc gọi hàm mơ hồ.

Hy vọng duy nhất của bạn có lẽ là để vá mã nguồn GCC.

Đào trong nó (phiên bản: 4.7.1), tôi đã tìm thấy những gì xuất hiện được chức năng có liên quan trong gcc/cp/pt.c:

void 
print_candidates(tree fns) 
{ 
    const char *str = NULL; 
    print_candidates_1 (fns, false, &str); 
    gcc_assert (str == NULL); 
} 

Là một đoán giáo dục, tôi nghĩ rằng bạn chỉ cần bình luận ra phần thân hàm.

+0

+1 cho LOL đôi. Đầu tiên tôi nghĩ đó chỉ là câu trả lời tounge-in-má. Sau đó tôi nhận ra rằng với gcc nó * phổ biến * để xây dựng trình biên dịch từ mã nguồn, và tại một thời điểm tôi biết điều đó, điều duy nhất khiến tôi khó hiểu bây giờ là đầu chức năng C/C++ hiện đại như tôi nhớ lại (nhưng tôi có thể sai) Cú pháp K & R C cũ ở khắp mọi nơi? –

+0

@ Cheersandhth.-Alf Đây là lần đầu tiên tôi xem xét mã cơ sở GCC và nó có lẽ là _too clean_ cho một dự án có kích thước này.Đối với cú pháp K & R C, tôi 10 năm quá trẻ thậm chí còn biết nó là gì :) – Gigi

+0

@ Cheersandhth.-Alf yes! Mã đã phát triển rất nhiều, một số tính năng C++ thậm chí được cho phép kể từ tháng năm 2010. Và tôi đồng ý rằng cơ sở mã thực sự đáng ngạc nhiên rõ ràng! – log0

10

Câu trả lời của tôi không phải là mát mẻ như một bản vá. Nếu bạn muốn có thông báo lỗi ít chi tiết hơn, tập lệnh này sẽ xóa mã xấu xí và chỉ để lại số dòng cho các ứng cử viên.

g++ test.cc 2>&1 | sed 's/^\([^ ]*:[0-9]*: note\):.*/\1/' 

Vì vậy, nó có thể được sử dụng trong một kịch bản như thế này:

#!/bin/bash 
GXX=/usr/bin/g++ 
ARGS=() 
i=0 
show_notes=yes 
for arg in "[email protected]" ; do 
    if [ "$arg" = "-fterse-notes" ] ; then 
     show_notes=no 
    elif [ "$arg" = "-fno-terse-notes" ] ; then 
     show_notes=yes 
    else 
     ARGS[$i]="$arg" 
    fi 
    i=$[i+1] 
done 
if [ $show_notes = yes ] ; then 
    exec ${GXX} "${ARGS[@]}" 
else 
    exec ${GXX} "${ARGS[@]}" 2>&1 | sed 's/^\([^ ]*:[0-9]*: note\):.*/\1/' 
fi 

Nếu tên của kịch bản này là g++ và trong đường dẫn của bạn, nó sẽ làm việc như thể bạn đã thêm một dòng lệnh tùy chọn được gọi là -fterse-notes.

+0

Chắc chắn bạn chỉ muốn tăng $ i bên trong đầu tiên 'khác'? – cdyson37

+1

@ cdyson37: Tôi đang thực sự tạo ra một danh sách đối số mới để xóa các lần xuất hiện của '-fterse-notes' và' -fno-terse-notes'. 'bash' dường như xử lý những gì tôi đã viết được, nhưng có lẽ việc thực hiện chính xác hơn về kỹ thuật sẽ chỉ tăng nó trong mệnh đề' else' sau câu lệnh 'ARGS [$ i] =" $ arg "'. – jxh

10

-Wfatal-errors làm những gì bạn muốn?

Nó dừng tất cả lỗi sau khi người đầu tiên, đó là không giống như chỉ đơn giản là đàn áp các chức năng ứng cử viên ghi chú, nhưng nó làm giảm sản lượng đáng kể:

$ cat a.cc 
void f() { } 
void f(int) { } 
void f(char) { } 

int main() 
{ 
    f((void*)0); 
} 
$ g++ a.cc 
a.cc: In function ‘int main()’: 
a.cc:7: error: call of overloaded ‘f(void*)’ is ambiguous 
a.cc:2: note: candidates are: void f(int) <near match> 
a.cc:3: note:     void f(char) <near match> 
$ g++ a.cc -Wfatal-errors 
a.cc: In function ‘int main()’: 
a.cc:7: error: call of overloaded ‘f(void*)’ is ambiguous 
compilation terminated due to -Wfatal-errors. 

Hoặc, nếu bạn muốn vá GCC , công cụ này thêm công tắc -fno-candidate-functions:

--- gcc/c-family/c.opt.orig 2012-07-11 16:37:29.373417154 +0000 
+++ gcc/c-family/c.opt  2012-07-11 17:09:47.340418384 +0000 
@@ -752,6 +752,10 @@ 
fbuiltin- 
C ObjC C++ ObjC++ Joined 

+fcandidate-functions 
+C++ ObjC++ Var(flag_candidates) Init(1) 
+-fno-candidate-functions Do not print candidate functions when overload resolution fails 
+ 
fcheck-new 
C++ ObjC++ Var(flag_check_new) 
Check the return value of new 
--- gcc/cp/call.c.orig  2012-07-11 17:08:34.186424089 +0000 
+++ gcc/cp/call.c 2012-07-11 17:09:51.843444951 +0000 
@@ -3317,6 +3317,9 @@ 
    for (n_candidates = 0, cand1 = candidates; cand1; cand1 = cand1->next) 
    n_candidates++; 

+ if (!flag_candidates) 
+ return; 
+ 
    inform_n (loc, n_candidates, "candidate is:", "candidates are:"); 
    for (; candidates; candidates = candidates->next) 
    print_z_candidate (loc, NULL, candidates); 
--- gcc/cp/pt.c.orig  2012-07-11 16:37:35.658636650 +0000 
+++ gcc/cp/pt.c  2012-07-11 17:10:20.910435942 +0000 
@@ -1751,9 +1751,12 @@ 
void 
print_candidates (tree fns) 
{ 
- const char *str = NULL; 
- print_candidates_1 (fns, false, &str); 
- gcc_assert (str == NULL); 
+ if (flag_candidates) 
+ { 
+  const char *str = NULL; 
+  print_candidates_1 (fns, false, &str); 
+  gcc_assert (str == NULL); 
+ } 
} 

/* Returns the template (one of the functions given by TEMPLATE_ID) 
Các vấn đề liên quan