Xin chào, và chào mừng trở lại.
Trong bài giảng này, tôi chỉ muốn điểm qua một số trình biên dịch và cảnh báo phổ biến.
Chúng tôi đã nói về một số vấn đề c phổ biến.
Nhưng đôi khi bạn thậm chí không biết rằng bạn có những lỗi đó trong chương trình của mình khi trình biên
dịch đang cố gắng thông báo cho bạn điều đó.
Các lỗi và cảnh báo của trình biên dịch có xu hướng thực sự khó hiểu đối với các lập trình viên mới.
Họ có thể nói với bạn rằng bạn đang thiếu dấu chấm phẩy, nhưng nó cho biết không thể truy cập kết thúc câu lệnh.
Và đối với một số người mới, họ thậm chí có thể không biết điều đó có nghĩa là gì.
Vì vậy, cần phải thực hành rất nhiều trong việc viết rất nhiều mã
và để giải mã một số cảnh báo của trình biên dịch này theo thời gian.
Nhưng tôi muốn cho bạn biết trước điều đó.
Vì vậy, một số vấn đề phổ biến mà bạn đã thấy trong bài giảng trước,
tôi sẽ thực sự mô tả một số cảnh báo và lỗi của trình biên dịch và nó thực sự sẽ nói gì.
Điều rất rất quan trọng là phải nói cho bạn hiểu những gì trình biên dịch đang nói với bạn.
Nếu trình biên dịch đang cho bạn biết lỗi đó, nhưng bạn không hiểu lỗi
đó, bạn sẽ mất nhiều thời gian hơn để sửa mã đó.
Nhưng nếu bạn thấy lỗi và bạn biết chính xác nó đang nói gì thì bạn có
thể đi và sửa nó ngay lập tức.
Tôi nhớ, tôi đã ở trong phòng thí nghiệm khi tôi mới
bắt đầu lập trình, và tôi sẽ
thiếu dấu chấm phẩy, một điều rất phổ biến. Và trình biên dịch sẽ nói với tôi rằng tôi đang thiếu dấu chấm phẩy,
nhưng tôi không biết điều đó, nó
sẽ chỉ thông báo kết thúc của câu lệnh không thể truy cập được, và tôi muốn, điều đó
có nghĩa là gì, một câu lệnh là gì. Tôi sẽ rất bối rối.
Vì vậy, đó là lý do tại sao tôi muốn cung cấp cho bạn một số mẹo về những gì trình biên dịch thực sự đang cố gắng nói với bạn.
Vì vậy, rất khó để hiểu những gì trình biên dịch đang phàn nàn.
Để giải mã những thông điệp này
đôi khi rất khó hiểu.
Vì vậy, bạn cần phải hiểu những lỗi trình biên dịch này để sửa chúng, khá cơ bản.
Và trình biên dịch đang thực hiện một nửa công việc cho bạn.
Nó kiểm tra cú pháp, cho bạn biết chính xác điều gì sai, vì vậy
bạn nên sử dụng nó để có lợi cho mình.
Nhưng đôi khi rất khó để hiểu chính xác những gì nó đang nói, đặc biệt nếu bạn
là người mới và bạn không hiểu một số thuật ngữ.
Trình biên dịch đưa ra quyết định về cách dịch mã của bạn
mà lập trình viên chưa viết trong mã.
Điều này thuận tiện cho chương trình và trình biên dịch, vì vậy
nó có thể được viết ngắn gọn hơn.
Và chỉ những lập trình viên chuyên nghiệp mới tận dụng được tính năng này.
Vì vậy, những gì tôi đang nói với bạn là khi bạn biên dịch,
bạn nên luôn sử dụng tùy chọn tường gạch ngang.
Điều này sẽ làm bật mọi thứ.
Vì vậy, đôi khi một tính năng nâng cao hơn là bạn
sẽ thực sự lấy
ra một số thứ, để bản dịch hiệu quả hơn một chút.
Nhưng khi bạn thêm điều
đó, bạn khiến chương trình được biên dịch theo cách khác.
Và kết quả là, bạn có thể có cảnh báo trong mã của mình mà bạn không biết.
Vì vậy, lý do tôi nói với bạn đó là bạn luôn muốn biên dịch với một tùy chọn nhất
định, đó là tùy chọn tường gạch ngang.
Và bạn thực sự theo mặc định nó được bật trong các khối mã.
Và điều này sẽ thông báo cho bạn về tất cả các trường hợp trình
biên dịch đang làm những điều mà bạn không biết.
Nó cũng sẽ bật tất cả các cảnh báo, cung cấp
cho bạn rất nhiều thông tin, đó là tùy chọn trình biên dịch rất hữu ích.
Khi bạn đã bật tùy chọn đó, bạn có thể cố gắng
giúp bạn hiểu rõ hơn một số điều mà trình biên dịch đang nói với bạn.
Vì vậy, trình biên dịch sẽ chỉ cho bạn
hai loại vấn đề. Một là một lỗi.
Điều này thực sự sẽ ngăn cản việc tạo chương trình.
Bạn có một lỗi cú pháp và chương trình không thể được biên dịch.
Không có công việc thực
thi nào được tạo lại và. Thông thường, khi bạn nhìn thấy lỗi từ trình biên dịch,
bạn luôn muốn tập trung vào lỗi đầu tiên đó.
Đó là lỗi đáng tin cậy
nhất vì một số lỗi khác có thể là kết quả của lỗi đầu tiên đó.
Vì vậy, hãy luôn tập trung vào lỗi đầu tiên đó. Trước tiên, hãy sửa các lỗi ở trên cùng,
sau đó biên dịch lại và xem các lỗi khác có biến mất hay không.
Cảnh báo. Cảnh báo là các thông báo mà trình
biên dịch hiển thị về các tình huống đặc biệt và trong đó một số loại bất thường đã được phát hiện.
Đó là lỗi không nghiêm trọng. Vì vậy, tệp thực thi sẽ được tạo.
Nhưng nó vẫn là một cái gì đó mà bạn nên sửa chữa.
Cảnh báo là có lý do. Bạn đang làm điều gì đó không chính
xác hoặc nó có thể gây ra sự cố trong tương lai.
Vì vậy, bạn muốn luôn sửa chữa tất cả các cảnh báo của mình.
Và bằng cách biên dịch với tùy chọn tường gạch ngang, bạn
không coi chương trình là chính xác cho đến khi tất cả các cảnh báo đã bị loại bỏ.
Vì vậy việc biên dịch sẽ không bị lỗi. Đây là lý do tại sao
tôi yêu cầu bạn sử dụng tùy chọn này cũng như xem mọi thứ đang diễn ra bởi trình biên dịch.
Vì vậy, một số thông báo trình biên dịch phổ biến nhất mà bạn sẽ gặp phải và
điều này sẽ liên quan trực tiếp đến một số vấn đề c phổ biến nhất mà
chúng tôi đã đề cập trước đó.
Nếu một biến không được khai báo, bạn sẽ thấy biến thông báo này không được khai báo
trước khi sử dụng hàm này.
Đây là một trong những trường hợp phổ biến nhất và thường dễ phát hiện hơn.
Và sau đó nó cũng sẽ hiển thị biểu
tượng trước thông báo này.
Về cơ bản, nó sẽ nói rằng
bạn đang cố gắng sử dụng biến này, nhưng bạn chưa bao giờ thực sự khai báo nó.
Chúng tôi biết rằng khi bạn khai báo một biến, bạn chỉ định kiểu dữ liệu.
Bạn không thể chỉ ký dữ liệu vào các biến không tồn tại.
Một tuyên bố ngầm cảnh báo về chức năng, điều này liên quan đến các khai báo chức năng.
Đó là khi bạn đang cố gắng gọi một hàm, nhưng nếu
hàm không có bất kỳ triển khai nào được liên kết. Bạn đã không bao gồm tiêu đề hoặc bạn
đã không khai báo nó. Vì vậy, nó không biết nó ở đâu,
và nó không biết hàm được khai báo như thế nào, nó không biết các đối số, nó không biết giá trị trả về.
Không có thông tin về chức năng chính nó?
Để giải quyết vấn đề này, hãy luôn khai báo một nguyên mẫu hàm ở trên cùng.
Một cảnh báo khác là nó sẽ cho biết điều khiển cảnh báo kết thúc hàm non-void, điều này sẽ
xảy ra khi một hàm đã được xác định là trả về kết quả là nó không có giá trị, nhưng
không có câu lệnh trả về nào được bao gồm trong hàm.
Vì vậy, bạn đã quên trả lại dữ liệu.
Hàm được xác định không chính xác trong đó bạn phải xóa kiểu dữ
liệu trước khi khai báo hàm hoặc bạn quên thêm
câu lệnh trả về đó. Một trong những cái khác phải
được thay đổi để khắc phục cảnh báo này.
Nhưng bạn thấy đây là một cảnh báo. Bạn vẫn có thể biên dịch ở đó,
nhưng điều đó thực sự có thể gây ra sự cố cắt trong chương trình của bạn.
Nếu bạn đang mong đợi một hàm trả về một cái gì đó và nó không như vậy, vì vậy bạn muốn sửa các
cảnh báo của mình biến không sử dụng, một cảnh báo phổ biến khác.
Điều này được trình biên dịch in ra khi một biến được khai báo, nhưng nó không bao giờ được sử dụng.
Bạn không nên khai báo một biến nếu bạn không sử dụng
nó, vì vậy hãy xóa khai báo đó.
Tôi có xu hướng nhận được những thứ này khá ít khi tôi thực hiện một số bản trình diễn của mình bởi
vì tôi để lại trong các biến mà tôi không bao giờ sử dụng.
Hoặc khi tôi đang trình bày cách khai báo một biến và sau đó tôi biên dịch
nó để cho bạn thấy rằng biến đó đã được biên dịch, tôi sẽ nhận được cảnh báo rằng nó chưa bao giờ được sử dụng.
Vì vậy, điều đó không sao cả bởi vì tôi đang trình diễn một cái gì đó. Nhưng hãy xóa các biến
của bạn nếu chúng không được sử dụng. Không cần khai báo.
Tham chiếu không xác định tới. Điều này xảy ra trong giai đoạn liên kết.
Vì vậy, hãy nhớ trình biên dịch hoặc giai đoạn biên dịch, nó sẽ biên dịch.
Đầu tiên, nó sẽ chạy bộ tiền xử lý, sau đó nó sẽ tạo ra các tệp đối tượng và sau đó nó sẽ lấy các
tệp đối tượng đó và liên kết chúng lại với nhau để tạo thành một chương trình hoàn chỉnh.
Vì vậy, trong giai đoạn liên kết, nó
cần phải giải quyết bất kỳ phụ thuộc bên ngoài nào.
Hoặc cụ thể là bất kỳ chức năng nào bạn đang gọi, chúng
cần được triển khai ở đâu đó.
Vì vậy, nếu nó không có tệp đối tượng đó, nó sẽ cho bạn vấn đề này.
Bạn đang cố gọi một hàm, nhưng chúng tôi không có mã cho nó.
Vì vậy, bạn phải chắc chắn rằng bạn liên
kết đến tệp này.
Thông thường liên kết sẽ xảy
ra cho bạn, nhưng trong GCC, bạn chỉ có thể thực hiện tùy chọn gạch
ngang l để thêm tệp liên kết. Vì vậy, nếu bạn đang sử dụng một hàm
trong tệp tiêu đề toán học, nhưng bạn không liên kết đến tệp đối tượng toán học, bạn sẽ gặp lỗi này.
Và nó cũng xảy ra nếu bạn đã xác định người dùng và
bạn không bao gồm tệp nguồn c.
Vì vậy, bạn có nhiều tệp nguồn c.
Một trong các tệp nguồn c đang thực hiện chức năng này.
Một tệp nguồn c khác bao gồm tiêu đề và
gọi nó, nhưng bạn
chưa bao giờ biên dịch tệp nguồn c khác có phần triển khai, bạn sẽ
thấy lỗi này.
Vì vậy, hãy đảm bảo rằng bạn mang theo tệp nguồn đó, hãy đảm bảo bạn
mang theo bất kỳ tệp nguồn thư viện tiêu chuẩn nào nếu bạn cần thông thường một cách rõ ràng, bạn không cần phải làm điều đó.
Một lỗi phổ biến khác là khi các loại xung đột cho.
Đây là khi bạn thực sự đã xác định hoặc khai báo một nguyên mẫu hàm và sau đó khi
bạn triển khai nó, nó không giống như cách bạn đã khai báo.
Vì vậy, ví dụ: nguyên mẫu có kiểu kết quả và tên của dấu ngoặc đơn cho các tham số và
sau đó là dấu chấm phẩy.
Và sau đó khi bạn xác định việc triển
khai, bạn có một tiêu đề chức năng thực tế khác.
Bạn có một kiểu trả lại khác hoặc bạn có một số tham số khác.
Và điều này đang nói tốt, này, bạn
có một khai báo hàm này. Và sau đó khi bạn thực hiện nó ở bên dưới, nó hoàn toàn khác.
Vì vậy, có một sự không phù hợp.
Và điều này sẽ thực sự cho bạn thấy rằng xung đột xuất hiện trong
định nghĩa trước đó đã gây ra mâu thuẫn.
Vì vậy, trong phần triển khai thường là nơi nó hiển thị cho bạn dòng vì thường
thì bạn khai báo các hàm của mình ở trên cùng.
Lỗi thời gian chạy. Lỗi thời gian chạy là sự cố trong mã
của bạn xảy ra khi bạn chạy chương trình, không phải khi bạn biên dịch nó.
Vì vậy, đây thường
là những sự cố hoặc chúng là những lỗi không nghiêm
trọng khi bạn vượt quá giới hạn hoặc tương tự như vậy.
Đó là khi chương trình đang chạy, bạn có một số loại lỗi logic.
Vì vậy, việc thực thi các chương trình c có thể kết thúc đột ngột với sự cố khi phát hiện ra
lỗi thời gian chạy, điều mà nó không thể xử lý. Có một sự hư hỏng bộ nhớ, như
tôi đã đề cập.
Lỗi ngoài giới hạn thường gây ra sự cố chương trình.
Thông thường, những gì bạn sẽ thấy là lỗi phân đoạn.
Và lỗi phân đoạn không thực sự cho bạn biết bất cứ điều gì.
Vì vậy, thông thường những gì bạn muốn làm để chẩn đoán thêm vấn đề
này là nhìn vào ngăn xếp cuộc gọi,
như tôi đã đề cập trước khi chương trình gặp sự cố từng
dòng một để xem dòng nào đang gây ra sự cố.
Bạn có thể lấy ngăn xếp cuộc gọi nếu có tệp lõi, mà tôi đã đề cập trước đó.
Và sau đó từ ngăn xếp cuộc gọi, bạn có thể thấy dòng nào đang gặp sự cố.
Hoặc tốt hơn, hãy chạy trình gỡ lỗi, từng dòng một và sau đó khi bạn thực thi một dòng, trình gỡ
lỗi, bạn sẽ thấy chương trình bị lỗi và bạn có thể xác định nó theo cách đó.
Vì vậy, đây chỉ là một số mẹo khác về
các lỗi biên dịch và cảnh báo và thông báo và cách giải thích chúng.
Thực sự có các
liên kết trực tuyến. Hoặc nếu bạn
sử dụng google, nó sẽ cho bạn biết mọi lỗi biên dịch và cảnh
báo có thể được tạo ra và nó thực sự sẽ đưa ra
định nghĩa về lý do tại sao nó được tạo
ra và vấn đề cơ bản là gì.
Bởi vì một lần nữa, những lỗi biên dịch đó có thể rất khó hiểu.
Và thậm chí một từ đã nói lên sự kiểm
soát không thể tiếp cận. Bạn nhất thiết phải biết từ mô tả đó trừ
khi bạn đã trải nghiệm điều đó, điều đó có nghĩa là bạn không bao giờ trả lại thứ gì đó từ một hàm.
Nhưng nếu bạn làm vậy, một trong những cách tốt nhất để tìm và khắc phục
sự cố trong chương trình của bạn khi bạn gặp lỗi trình biên dịch và bạn không hiểu
trình biên dịch đó, hãy google nó. Và thông thường những gì sẽ xảy ra là bạn sẽ bị tràn ngăn xếp.
Và nó sẽ cho bạn biết đây là lỗi của bạn, đây là cách bạn
giải quyết nó. Tôi làm điều đó cho đến ngày nay.
Tôi đã lập trình trong c được 15 năm, nhưng vẫn có những
lúc tôi gặp phải những thứ, và tôi thích điều này chính xác nghĩa là gì.
Và tôi sẽ google nó, thực sự tôi sẽ lấy trình biên dịch, đặt nó trong dấu ngoặc kép và nó
sẽ cho tôi biết chính xác những gì đang xảy ra.
Tràn ngăn xếp là một trang web thực sự rất tốt.
Và nó thực sự có thể tiết kiệm rất nhiều thời
gian trong quá trình gỡ lỗi. Đừng chỉ cố đoán khi bạn thấy trình biên dịch hoặc cảnh báo.
Trình biên dịch đó đang cố gắng cho bạn biết điều gì đó và nó sẽ xác định chính xác những gì đang xảy ra.
Vì vậy, nếu bạn hiểu nó, bạn sẽ có thể khắc phục sự cố của mình nhanh hơn rất nhiều.
Và nếu đó không phải là thứ bạn quen
thuộc, hãy chuyển đến phần tràn ngăn xếp hoặc truy cập trang web mô tả tất cả chúng
và bạn có thể giải mã theo cách đó.
Tôi hy vọng nó sẽ có ích. Cảm ơn bạn.