Tôi đang đọc qua "Ngôn ngữ lập trình C++ - Ấn bản lần thứ tư" và tôi đã nhập một bài tập đơn giản chỉ để nhận cú pháp C++ và vô tình tình cờ gặp một thứ khiến tôi nâng cao mày. Nói tóm lại, tôi quên để thêm ()
trên accept
trong chính:Chức năng gọi thiếu cảnh báo danh sách đối số
bool accept()
{
cout << "Do you want to proceed (y or n)?\n";
char answer = 0;
cin >> answer;
if (answer == 'y')
{
return true;
}
return false;
}
int main()
{
accept;
}
này chạy và biên dịch và tạo ra (trong VS2015) một
C4551 - chức năng gọi thiếu danh sách đối số
Tôi đã tìm thấy bản thân mình đọc và một loạt các câu hỏi trên SO nên được đóng vì chúng chủ yếu yêu cầu "gỡ lỗi mã của tôi".
Tôi nhận thấy nếu mã biên dịch và chạy, và hàm chứa câu lệnh chặn (chờ đầu vào của người dùng) và kiểu trả về, tất cả mã sẽ được thực thi như mong đợi bất kể thiếu dấu ngoặc đơn; đó không phải là trường hợp mặc dù.
Ngoài ra, tôi nhận thấy tôi sẽ thay đổi cuộc gọi thành accept
trong chính, thành bool a = accept; cout << a;
để thử và ngăn chặn bất kỳ tối ưu hóa nào (và điều đó thực sự xảy ra) và điều đó cũng không gọi mã số accept()
.
Những gì tôi đang tò mò muốn biết là:
- gì được cuộc gọi đến
accept
nhận được biên soạn vào? - Tại sao mã không phải là
accept
được gọi là - Tại sao đây chỉ là cảnh báo chứ không phải là lỗi (tôi biết tôi có thể thay đổi cấu hình để hiển thị lỗi này, tôi thắc mắc cách thức điều này được chấp nhận cú pháp theo mặc định khi kết quả thực tế khác với kết quả mong đợi vì vậy "đáng kể?" Câu hỏi này có thể là dựa trên ý kiến, bỏ qua nếu bạn đồng ý.)
- Chạy mã
bool a = accept; cout << a;
trong sản xuất chính1
làm đầu ra. Làm thế nào điều này có thể được khifalse
là giá trị bool mặc định (trong C# ít nhất) và không có gì để trả về giá trị thực vì mã chấp nhận không được thực thi?
có thể trùng lặp của [Tại sao không phải là C++ biên dịch phàn nàn khi tôi sử dụng các chức năng không có dấu ngoặc?] (Http://stackoverflow.com/questions/11082329/why-doesnt-the-c-compiler-complain -khi-i-sử dụng-hàm-không-dấu ngoặc đơn) và http://stackoverflow.com/questions/17073066/g-calling-function-without-parenthesis-not-f-but-f-why-always-return –
@ HithamS.AlQadheeb: Khi nó ở gần, anh ta hỏi một vài thứ khác liên quan đến con trỏ hàm và phân rã thành 'bool'. Vì vậy, nó không phải là một bản sao hoàn chỉnh. –
@ HithamS.AlQadheeb câu trả lời trong "trùng lặp" chỉ trả lời một phần câu hỏi của tôi. Tiêu đề của câu hỏi "trùng lặp" là hoàn toàn trái ngược với những gì tôi đang gặp, vì trình biên dịch của tôi đã đưa ra cảnh báo, vì vậy tôi sử dụng văn bản cảnh báo làm tiêu đề câu hỏi để tìm kiếm dễ dàng khi người khác gặp phải cảnh báo tương tự. Các câu hỏi khác sử dụng cùng một tiêu đề của tôi hỏi "tại sao mã của tôi không hoạt động", do đó, có thể có giá trị hơn khi đóng những câu hỏi đó lại khi đóng chữ Q của tôi khi "dupe" bạn tìm thấy (cũng không phải là dupe, và) có thể tìm kiếm được. – Kcvin