2010-11-18 11 views
5

Giả sử chúng ta có đoạn mã sau:Buộc GCC 4.x để xử lý -Wreturn-type như một lỗi mà không cho phép -Werror?

#if !defined(__cplusplus) 
# error This file should be compiled as C++ 
#endif 

#include <stdio.h> 
#include <string> 

//#define USE_CXX_CLASS 
#ifdef USE_CXX_CLASS 
class SomeClass 
{ 
public: 
    SomeClass() {} 
    ~SomeClass() {} 
    std::string GetSomeString() 
    { 
     // case #1 
    } 
}; 
#endif // USE_CXX_CLASS 

int foo() 
{ 
    // case #2 
} 

int 
main (int argc, char *argv[]) 
{ 
    (void)argc; 
    (void)argv; 
#ifdef USE_CXX_CLASS 
    SomeClass someInstance; 
    someInstance.GetSomeString(); 
#endif // USE_CXX_CLASS 
    foo(); 
    return 0; 
} 

Và giả sử rằng nó đã được biên soạn ++ biên dịch C (và không phải là trình biên dịch C) từ GCC phiên bản 4.2.1 với các tùy chọn -Wreturn-type -Werror=return-type. Nếu đoạn mã trên được biên dịch như là không có đầu tiên uncommenting dòng //#define USE_CXX_CLASS trên, sau đó bạn sẽ thấy một cảnh báo nhưng không có lỗi:

.../gcc-4.2.1/bin/g++ -g -fPIC -Wreturn-type -Werror=return-type test.cpp -c -o test.o 
test.cpp: In function 'int foo()': 
test.cpp:26: warning: control reaches end of non-void function 

Nhưng nếu dòng //#define USE_CXX_CLASS là không chú thích, sau đó cảnh báo đối xử dưới dạng lỗi:

.../gcc-4.2.1/bin/g++ -g -fPIC -Wreturn-type -Werror=return-type test.cpp -c -o test.o 
test.cpp: In member function 'std::string SomeClass::GetSomeString()': 
test.cpp:18: error: no return statement in function returning non-void [-Wreturn-type] 
gmake: *** [test.o] Error 1 

Có, một là hàm không phải thành viên (trường hợp # 2) và hàm kia là hàm C++ (trường hợp # 1). IMO, điều đó không quan trọng. Tôi muốn cả hai điều kiện được coi là lỗi và tôi không muốn thêm -Werror hoặc -Wall vào thời điểm này trong thời gian này (có thể sẽ làm như vậy sau, nhưng điều đó nằm ngoài phạm vi của câu hỏi này).

tiểu Câu hỏi của tôi là:

  1. Có một số công tắc GCC mà tôi đang thiếu nên hoạt động? (Không, tôi không muốn sử dụng số #pragma.)
  2. Đây có phải là lỗi đã được giải quyết trong phiên bản GCC mới hơn không?

Để tham khảo, tôi đã đổ qua các câu hỏi tương tự khác đã có, bao gồm:

+0

Câu hỏi được viết rất hay. – GManNickG

+0

bạn đã tìm thấy giải pháp cho @bgoodr –

+0

Chưa. Nó có thể là trường hợp đây thực sự là một lỗi cố định trong các bản phát hành gần đây của trình biên dịch, nhưng vì tôi không có tùy chọn để nâng cấp trình biên dịch vào thời điểm này, tôi sẽ đợi cho đến khi chúng ta thực hiện. – bgoodr

Trả lời

0

Dường như với tôi rằng những gì bạn cần là một trình bao bọc shell script xung quanh gcc.

  • Đặt tên giống như gcc-wrapperg++-wrapper.
  • Trong bộ Makefile của bạn đặt CC và CXX thành trình bao bọc.
  • Để trình bao bọc gọi GCC và đưa đầu ra của nó vào chương trình khác sẽ tìm kiếm các chuỗi cảnh báo bạn muốn.
  • Thoát khỏi chương trình tìm kiếm bằng một lỗi khi phát hiện cảnh báo.
+0

Cảm ơn Zan. Trên thực tế những gì tôi đã được chủ yếu là tìm kiếm là một câu trả lời cho câu hỏi phụ # 1.Tôi không muốn tham gia vào việc kinh doanh bao quanh những thứ mà tôi tin rằng GCC sẽ hỗ trợ. Tôi bắt đầu kết luận rằng đây là một lỗi (hoặc thiếu tính năng) trong chính GCC. – bgoodr

1

Tôi thấy lỗi ngay cả khi cờ USE_CXX_CLASS. tức là g ++ phù hợp với lỗi cho cả hàm thành viên của lớp và các hàm không phải của thành viên. g ++ (GCC) 4.4.3 20100127 (Mũ Đỏ 4.4.3-4)