Cú pháp
Thao tác với goto
khá đơn giản. Cú pháp như sau:
goto label_name; // Several code line label_name: statement;
Khi gặp từ khoá goto
, chương trình sẽ nhảy đến biểu thức gắn nhãn được khai báo. Biểu thức này và dòng code goto
bắt buộc phải nằm trong cùng một scope (phạm vi), nếu không chương trình sẽ báo lỗi (error C0294).
Biểu thức được gắn nhãn có thể là bất cứ biểu thức nào, theo sau một định danh và dấu hai chấm.
Sơ đồ hoạt động
Một số lưu ý khi sử dụng goto
Do đặc tính nhảy vô điều kiện đến bất kỳ vị trí nào trong hàm nên dễ dẫn đến lỗi chương trình như chưa khai báo hoặc khởi tạo biến. Do đó lập trình viên cần hết sức thận trọng khi quyết định sử dụng goto
.
Ngoài ra, sử dụng goto
cũng có thể dẫn đến trường hợp lặp vô hạn. Ví dụ sau đây sẽ minh hoạ rõ hơn:
int main() { label1: // Some statement goto label2; // Some statement label2: // Some statement goto label1; return 0; }
Với những chương trình nhỏ, lỗi này dường như có thể được phát hiện dễ dàng. Nhưng hãy tưởng tượng một dự án game cỡ vừa, có hàng chục file mã nguồn, cùng với hàng trăm hàm, biến hỗ trợ. Việc phát hiện ra lỗi này sẽ không hề đơn giản nếu như không cẩn thận ngay từ đầu.
Đa số các trường hợp sử dụng goto
đều có các giải pháp thay thế an toàn hơn. Do đó nếu không bắt buộc, nên chọn những giải pháp khác để tránh tối đa rủi ro khi sử dụng.
Tuy nhiên, nếu goto
được sử dụng hợp lý, chương trình sẽ rất trực quan và gọn gàng. Dưới đây là một ví dụ về việc sử dụng hợp lý goto
:
// Neccessary files and function void main() { if(!openDataFile()) goto quit; if(!getDataFromFile()) goto closeFileAndQuit; if(!allocateSomeResources()) goto releaseResourcesAndQuit; // Do more work here.... releaseResourcesAndQuit: // Release resources closeFileAndQuit : // Close file quit : // Quit! }