2009-04-02 37 views

Trả lời

27

Bạn cần phải giới hạn mỗi tập tin khỏi bị bao gồm chỉ một lần. Bạn có thể làm điều này theo 2 cách.

1) Ở phía trên cùng của tập tin tiêu đề của bạn đặt:

#pragma once 

Hoặc 2) nếu trình biên dịch của bạn không hỗ trợ đó, đặt ở đầu/kết thúc các tập tin tiêu đề của bạn:

#ifndef _MYFILE_H_ 
#define _MYFILE_H_ 
... 
#endif 

Thay thế MYFILE bằng tên tệp của bạn và thay thế ... bằng nội dung của tệp tiêu đề.

+1

Tôi nghĩ rằng #pragma chỉ hoạt động trong VC++, không phải trong gcc . Mẹo #define là di động. – Gorpik

+0

supoprted bởi gcc và vC++ –

+0

Wikipedia nói #pragma một lần được hỗ trợ bởi VC++ và gcc http://en.wikipedia.org/wiki/Pragma_once. –

10

Lỗi có nghĩa là có một biểu tượng đã được xác định ở một nơi và một định nghĩa thay thế đã được thực hiện ở một nơi khác.

Điều này có thể xảy ra nếu trong trường hợp như:

  • nếu bạn định nghĩa hai hàm có cùng tên
  • nếu có sự không phù hợp giữa chức năng và nguyên mẫu của nó
  • bạn gọi một không tầm thường trước khi nó được xác định và không có mẫu thử nghiệm

Trong trường hợp này sẽ có sự không khớp giữa hàm thực và "khai báo ngầm" mà trình biên dịch giả định s khi nó không có một nguyên mẫu để sử dụng.

Những tình huống này có thể tránh được bằng cách:

  • Đảm bảo rằng nguyên mẫu chức năng chỉ tuyên bố một lần
  • Đảm bảo rằng tất cả các chức năng có tên duy nhất trong phạm vi của họ (tức là bên trong một file nếu họ static, hoặc. duy nhất nếu chúng được sử dụng giữa các tệp đối tượng)
  • Hãy cẩn thận nếu sử dụng các câu lệnh extern trong tệp nguồn để khai báo các nguyên mẫu. Tốt hơn để sử dụng một mẫu thử nghiệm từ tệp tiêu đề thích hợp.
  • Đảm bảo rằng tất cả các hàm đều có nguyên mẫu - trong tệp nguồn trong trường hợp hàm static hoặc trong tệp tiêu đề nếu chúng được sử dụng bởi các tệp đối tượng khác.
  • Đảm bảo rằng tất cả các tập tin tiêu đề chỉ có thể được bao gồm một lần cho mỗi tập tin nguồn, bằng cách sử dụng một trong các cấu trúc được đề xuất bởi Mehrdad và Brian R. Bondy
Các vấn đề liên quan