2010-10-13 34 views
10

sau khi làm việc một thời gian trong dự án của tôi, cảnh báo này bắt đầu xuất hiện:Làm thế nào để ngăn chặn vĩ mô redefinition

2>Game.cpp 
2>c:\program files\microsoft sdks\windows\v6.0a\include\windef.h(126) : warning C4005: 'APIENTRY' : redefinición de macro 
2>  c:\users\ferran\directo\gameprojects\dev-libs\glfw\include\glfw.h(72) : vea la definición anterior de 'APIENTRY' 
2>c:\program files\microsoft sdks\windows\v6.0a\include\wingdi.h(23) : warning C4005: 'WINGDIAPI' : redefinición de macro 
2>  c:\users\ferran\directo\gameprojects\dev-libs\glfw\include\glfw.h(88) : vea la definición anterior de 'WINGDIAPI' 

tôi chắc chắn rằng đó là một vấn đề của thứ tự của các tập tin bao gồm để giải quyết, bởi vì không ai trong số các tệp này là của tôi. Câu hỏi của tôi là nếu có một cách chung để ngăn chặn hoặc để tìm những tập tin phải được sắp xếp lại để tránh thông điệp này.

Trả lời

17

Các thông báo lỗi sẽ mách bảo với bạn thứ tự đúng. Nó nói rằng windef.hwingdi.h đang xác định lại các biểu tượng đã được xác định trong glfw.h.

Đặt glfw.h sau khi Windows bao gồm tệp.

+2

Đó là câu trả lời rất hay vì đây là giải pháp chung hoặc ít nhất là điểm khởi đầu tốt để giải quyết các loại vấn đề này. – Killrazor

7

Sự cố nằm trong tệp Game.cpp. Hãy thử bao gồm windows.h trước glfw.h. Có một người bảo vệ trong glfw.h mà sẽ ngăn chặn cảnh báo rằng:

#ifndef APIENTRY 
#ifdef _WIN32 
    #define APIENTRY __stdcall 
#else 
    #define APIENTRY 
#endif 
#define GL_APIENTRY_DEFINED 
#endif // APIENTRY 
2

Thật không may hoặc may mắn thay, không. Không có công cụ nào tự động hóa nó. Bạn phải đọc mã trong các tệp tiêu đề đó, tìm ra những gì đang diễn ra và thực hiện các hành động thích hợp.

Các nhất mà bạn có thể làm là

  1. Kiểm tra nếu vĩ mô được xác định bằng ifdef hoặc if defined(...) or if !defined(...) cấu trúc tiền xử lý.
  2. Macro không xác định bằng cách sử dụng undef.

Chỉ ANSI C coi macro xác định lại lỗi.

+1

Đọc chương "thay thế macro" trong cả tài liệu stanard C99 và C11. Cả hai đều nói rằng macro không nên được xác định lại trừ khi danh sách thay thế giống hệt nhau. Vì vậy, tôi nghĩ rằng bạn sai rằng nó không được coi là một lỗi. Sự thật là hầu hết các __compilers__ chỉ tạo ra cảnh báo, nhưng đây là cách của họ đối phó với mã không compiliant. –

7

Microsoft thường không thiết kế tiêu đề để đứng độc lập. Hầu hết các tiêu đề theo định hướng Windows yêu cầu bạn đã bao gồm lần đầu tiên <windows.h>. Ngoại trừ sự phụ thuộc vào mẹ của tất cả các tiêu đề, thường không có phụ thuộc tiêu đề cụ thể như vậy bằng cách bao gồm <windows.h> đầu tiên bạn không nên có bất kỳ vấn đề.

+1

Có những ngoại lệ. Ví dụ winsock2.h phải được bao gồm đầu tiên để ngăn chặn việc bao gồm winsock.h được thực hiện từ windows.h –

+0

@ PawełStankowski: Cảm ơn! Điều đó nghe có vẻ như tôi phải có một số macro điều khiển bao gồm, vì vậy tôi đã kích hoạt Visual Studio (do tai nạn 2012), có một tính năng truy cập tiêu đề tốt. Ồ, tôi chỉ thấy hai khả năng: sử dụng bộ bảo vệ bên trong bao gồm '_WINSOCKAPI_', đó là dơ bẩn, hoặc sử dụng' WIN32_LEAN_AND_MEAN'.Sau này là gần như tiêu chuẩn thực hành, vì vậy mà nên được tốt. –

+0

Không sao, nếu bạn không cần bất kỳ chức năng nào đằng sau việc xác định nghĩa và chắc chắn rằng mã của bạn sẽ không được sử dụng từ dự án yêu cầu chức năng từ windows.h và được xác định bởi WIN32_LEAN_AND_MEAN. –

1

Điều này có thể do Visual Studio biên dịch trước tiêu đề cho bạn. Hãy chắc chắn rằng tất cả các tiêu đề tiêu chuẩn và microsoft được bao gồm trước khi bạn. Không bao gồm tiêu đề microsoft trong bất kỳ tập tin .h của bạn (có vẻ như bạn có windef.h và wingdi.h inlcuded trong glfw.h của bạn). Hãy chắc chắn rằng tất cả các tiêu đề của bạn có tác dụng phụ miễn phí. Vấn đề sau đó sẽ biến mất. Tìm ra chính xác những gì gây ra nó thường rất khó.

+0

FYI, glfw.h là một API dành cho OpenGL. _Không ai có thể thay đổi API. : P – Tqn

Các vấn đề liên quan