Tệp .h.gch là gì?


116

Gần đây tôi đã có một dự án lớp nơi tôi phải tạo một chương trình với G ++.

Tôi đã sử dụng một tệp makefile và vì lý do nào đó, nó đôi khi để lại tệp .h.gch.

Đôi khi, điều này không ảnh hưởng đến quá trình biên dịch, nhưng thường xuyên nó sẽ dẫn đến việc trình biên dịch phát ra lỗi cho một vấn đề đã được khắc phục hoặc không có ý nghĩa.

Tôi có hai câu hỏi:

1) Tệp .h.gch là gì và tệp này được sử dụng để làm gì? và

2) Tại sao nó lại gây ra những vấn đề như vậy khi nó không được dọn dẹp?


13
gcc tạo chúng nếu bạn vô tình yêu cầu nó biên dịch tệp .h. Đừng làm điều đó :) (trừ khi bạn thực sự muốn tạo ra một tiêu đề biên dịch sẵn)
jalf

3
Bên ngoài thế giới GCC , các tệp .gch được gọi là .pch .
Patapoom

Câu trả lời:


115

Một .gchtập tin là một tiêu đề biên dịch sẵn.

Nếu .gchkhông tìm thấy a thì các tệp tiêu đề bình thường sẽ được sử dụng.

Tuy nhiên, nếu dự án của bạn được thiết lập để tạo các tiêu đề được biên dịch trước, nó sẽ tạo ra chúng nếu chúng không tồn tại và sử dụng chúng trong lần xây dựng tiếp theo.

Đôi khi *.h.gchtệp sẽ bị hỏng hoặc chứa thông tin lỗi thời, vì vậy việc xóa tệp đó và biên dịch lại sẽ sửa được.


1
Vậy tại sao kích thước của .gch thường lớn như vậy?
NAND

38

Nếu bạn muốn biết về một tệp, chỉ cần nhập vào thiết bị đầu cuối

file filename

file a.h.gch cho:

GCC precompiled header (version 013) for C

2
Của tôi (OSX, zsh) chỉ nói "dữ liệu" cho .h.gchtệp. Tôi nghi ngờ bạn cần các tệp cơ sở dữ liệu thích hợp cho việc này.
Ondrej Slinták



15

Các câu trả lời khác hoàn toàn chính xác liên quan đến tệp gch là gì. Tuy nhiên, ngữ cảnh (trong trường hợp này là người mới bắt đầu sử dụng g ++) là tất cả. Trong bối cảnh này, có hai quy tắc:

  1. Không bao giờ, chưa bao giờ đặt tệp .h trên dòng biên dịch g ++. Chỉ các tệp .cpp. Nếu một tệp .h được biên dịch một cách tình cờ, hãy xóa mọi tệp * .gch

  2. Đừng bao giờ đặt tệp .cpp trong câu lệnh #include.

Nếu quy tắc một bị phá vỡ, một lúc nào đó vấn đề được mô tả trong câu hỏi sẽ xảy ra. Nếu quy tắc hai bị phá vỡ, tại một số điểm, trình liên kết sẽ phàn nàn về các ký hiệu do nhân xác định.


2
Đối với điểm đầu tiên, tôi sẽ sử dụng một hàm làm ví dụ. Trước khi một lập trình viên có thể gọi myfunc (), lập trình viên phải mô tả myfunc () cho trình biên dịch bằng cách sử dụng một nguyên mẫu hàm. Nếu một số tệp .cpp khác nhau gọi myfunc (), thì nguyên mẫu phải được cung cấp trong mỗi .cpp. Rất dễ xảy ra lỗi khi nhập nguyên mẫu trong mỗi tệp .cpp. Do đó, nguyên mẫu hàm được đặt trong tệp .h có #included trong mỗi tệp .cpp nơi myfunc được gọi. Tệp tiêu đề chỉ chứa thông tin cho trình biên dịch, không chứa mã được thực thi. Vì vậy, sẽ là vô nghĩa nếu đặt một tệp .h trên một dòng g ++.
tgibson

Trong quy tắc 2 của bạn, chúng tôi # bao gồm các tệp .cpp nếu chúng có định nghĩa về hàm mẫu
NAND
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.