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 là đố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à:
- 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
.) - Đâ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:
- Why does flowing off the end of a non-void function without returning a value not produce a compiler error?
- C question: no warning?
- Is a return statement mandatory for C++ functions that do not return void?
Câu hỏi được viết rất hay. – GManNickG
bạn đã tìm thấy giải pháp cho @bgoodr –
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