#ifdef bên trong #define


83

Tôi đang cố viết một cái gì đó như thế này:

Có cách nào để định nghĩa COV_ONnhư thế này không? Tôi biết những gì tôi đã làm ở trên là sai vì tôi không thể có #ifdefbên trong #define. ( #không phải là một ký tự được phép trong #define). Vậy có giải pháp nào không?


1
Tất cả các câu trả lời ở đây dường như bỏ qua việc sử dụng do {} while(0)(hoặc tương đương) để tránh một câu lệnh trống; xem câu trả lời của tôi trên bản sao được liên kết
Roger Lipscombe

Câu trả lời:


89

Không thể. Làm theo cách khác:


21

Đơn giản chỉ cần xoay nó lại:


Cảm ơn vì đã trả lời. Tôi đã thử COV_ON (bật) và COV_ON (tắt) nhưng sau đó tôi gặp lỗi thông báo lỗi: mong đợi ')', gần tắt. Bất kỳ ý tưởng về vấn đề.
agent.smith

chúng là chuỗi. Tôi có cần sử dụng chúng như các chuỗi thông thường bên trong báo giá không? Như "bật" và "tắt".
agent.smith

Nó phụ thuộc vào định nghĩa của bạn về COVERAGE, nhưng tôi đoán rằng bạn cần phải trích dẫn chúng. Tôi đề nghị bạn mở một câu hỏi khác cho vấn đề mới này.
Philip

Tôi đã thử nó với dấu ngoặc kép nhưng không sử dụng được. Tôi đã mở một chủ đề mới. Hãy cho tôi biết nếu bạn nghĩ cú pháp cho _Pragma là sai.
agent.smith

14

Đây là một câu hỏi cũ, nhưng nó cần một câu trả lời cập nhật.

Thay vì sử dụng ifdef nội dòng trong macro, bạn có thể xác định một cách chọn lọc __VA_ARGS__macro để thực hiện điều tương tự

Điều này có chức năng tương tự như ifdef ngoại trừ việc bạn nhận được dấu ngoặc đơn để phân định phần đầu và phần cuối (mà hầu hết các IDE không gặp vấn đề gì khi gấp mã) Trong khi bạn vẫn có thể sử dụng #define#ifdeftrong ngữ cảnh, điều #includenày không được phép. Để có được các khả năng nội tuyến tương tự #else, bạn có thể xác định một macro tương ứng như sau:

Chỉ một trong số NO_FOO()/IF_FOOsẽ tạo ra mã.

OK, đó là một bản hack tiện dụng, nhưng chúng ta có thể làm cho nó hữu ích HƠN#ifdefs ... Có lẽ logic và cấu hình Boolean không? Hãy thiết lập một số bảng sự thật (và một vài macro trợ giúp).

config.h

code.c


Tôi giống như phong cách của bạn (=
étale-cohomology

6

6

Bạn không thể. Nhưng bạn có thể hoán đổi #ifdef#define:


Cảm ơn vì đã trả lời. Tôi đã thử COV_ON (bật) và COV_ON (tắt) nhưng sau đó tôi gặp lỗi thông báo lỗi: mong đợi ')', gần tắt. Bất kỳ ý tưởng về vấn đề.
agent.smith

Nếu không biết trình biên dịch của bạn, chúng tôi sẽ cần biết _Pragmacú pháp mong đợi là gì; bạn sẽ làm như thế nào nếu không có macro?
sam hocevar

Tôi đang sử dụng trình biên dịch VC2005 và thấy cú pháp _Pragma trực tuyến. Tôi chưa bao giờ sử dụng #pragma theo cách này trước đây.
agent.smith

Sau đó, bạn sẽ cần một bản hack stringify. Xem câu hỏi và câu trả lời này .
sam hocevar

Tôi đoán vấn đề là VC2005. Họ không sử dụng _Pragma mà sử dụng __pragma. Tôi không chắc nhưng có vẻ như vậy. Nhưng tôi vẫn nhận được cảnh báo pragma không xác định với __pragma.
agent.smith

3

Như bạn đã đề cập, không thể có #ifdef trong #define. Thay vào đó, điều bạn nên làm là đảo ngược thứ tự:

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.