Tôi đang xem một số mã mà một người bạn gửi cho tôi, và anh ấy nói: "Nó biên dịch, nhưng không hoạt động". Tôi thấy rằng ông đã sử dụng các chức năng không có dấu ngoặc đơn, như sau:Tại sao trình biên dịch C++ không phàn nàn khi tôi sử dụng các hàm không có dấu ngoặc đơn?
void foo(){
cout<< "Hello world\n";
}
int main(){
foo; //function without parentheses
return 0;
}
Điều đầu tiên tôi nói là "sử dụng dấu ngoặc đơn, bạn phải". Và sau đó tôi đã kiểm tra mã đó - nó biên dịch, nhưng khi thực thi không hoạt động (không có "Hello world" được hiển thị).
Vì vậy, tại sao nó biên dịch (không có cảnh báo nào từ trình biên dịch GCC 4.7), nhưng không hoạt động?
Nó thực sự hoạt động. 'foo' được coi là con trỏ hàm. Dòng 'foo;' chỉ là một dòng không có hiệu lực. Nếu bạn bật cảnh báo của mình lên mức tối đa, bạn sẽ nhận được cảnh báo về tuyên bố không có hiệu lực. – RedX
Tôi thấy * "cảnh báo: tuyên bố là tham chiếu, không gọi, để báo cáo‘ foo ’" * và * "cảnh báo: không có hiệu lực" *. Bạn có thể muốn biên dịch với -Wall -Wextra – Flexo
(Đối với các câu hỏi trong tương lai, bạn nên đặt '#include' và mọi thứ không gian tên để hoàn thành mẫu của mình) –
Flexo