Tôi nhận được rất nhiều "định nghĩa lại x x x trước đây được xác định tại đây". Xin lỗi này có nghĩa là gì?Lỗi trình biên dịch GCC: "định nghĩa lại ... được xác định trước đây"
Trả lời
Có thể bạn đã bao gồm tệp tiêu đề hai lần. Đảm bảo các tệp tiêu đề của bạn được bao quanh bởi các câu lệnh #ifndef
.
http://www.fredosaurus.com/notes-cpp/preprocessor/ifdef.html
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 đề.
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
- 1. Macro gcc được xác định trước cho số phiên bản của trình biên dịch là gì?
- 2. Trình biên dịch GCC - lỗi hoặc hành vi không xác định?
- 3. angularJS $ biên dịch không được định nghĩa
- 4. GCC biên dịch có tài liệu tham khảo không xác định mặc dù trước đây chức năng liên kết Ubuntu
- 5. Tại sao NULL không được xác định trước bởi trình biên dịch
- 6. Định nghĩa hàm fastcall GCC
- 7. MSVC's _M_X64 Xác định macro được xác định trước
- 8. Trình biên dịch gcc không dừng lại trên lỗi đầu tiên
- 9. gcc 4.3.3 tùy chọn trình biên dịch được bật theo mặc định
- 10. Thất bại biên dịch Intellij: "đã được định nghĩa là"
- 11. Lỗi không xác định biên dịch khuôn khổ opencv
- 12. Trình biên dịch C++ tốt cho GCC
- 13. Thời gian biên dịch chậm với Boost + GCC + header được biên dịch trước
- 14. Lớp đơn có Lỗi định nghĩa lại lớp
- 15. Khi nào GCC xác định NDEBUG?
- 16. GLUT lối định nghĩa lại lỗi
- 17. Microsoft C++ Macro được xác định trước
- 18. Toán điểm cố định với trình biên dịch ARM Cortex-M4 và gcc
- 19. Tạo danh sách các macro tiền xử lý được xác định bởi trình biên dịch
- 20. Perl - Chương trình con được định nghĩa lại
- 21. Delphi biến môi trường được xác định trước
- 22. Xác định # độ dài chuỗi được xác định tại thời gian biên dịch
- 23. lỗi biên dịch gcc từ python
- 24. Lỗi trình biên dịch delphi E2134 có nghĩa là gì?
- 25. Cung cấp một destructor do người dùng định nghĩa (trống) gây ra lỗi biên dịch
- 26. Thay đổi Trình biên dịch Mặc định Trong Emacs?
- 27. Lỗi trình kết nối khi biên dịch chống lại glib ...?
- 28. Xây dựng lại tiêu đề được biên dịch trước
- 29. C89 vs c99 Trình biên dịch GCC
- 30. Trình tạo mẫu trong lớp mẫu phải được định nghĩa trong định nghĩa lớp?
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
supoprted bởi gcc và vC++ –
Wikipedia nói #pragma một lần được hỗ trợ bởi VC++ và gcc http://en.wikipedia.org/wiki/Pragma_once. –