Chúng tôi có macro chức năng #define FOO(arg) foo(arg)
với int foo(const char* bar);
. Khi NDEBUG được định nghĩa FOO được định nghĩa là #define FOO(arg) 0
, tuy nhiên điều này gây ra nhiều cảnh báo trình biên dịch bởi vì trong nhiều trường hợp, giá trị trả về của FOO không được sử dụng. Giải pháp nên làm việc với các trình biên dịch ANSI C và không gây ra cảnh báo nào. Tôi đã thử:Macro chức năng đánh giá về 0 và có thể được sử dụng làm tuyên bố
(void)0
: không thể assigend để biến
static int foo(const char* bar) { return 0; }
: gây không sử dụng cảnh báo chức năng tĩnh trong một số module
static inline int foo(const char* bar) { return 0; }
: chỉ hoạt động với các trình biên dịch C99
Cám ơn bạn Cứu giúp!
edit1: Nó giống như macro theo dõi và được sử dụng trên toàn bộ dự án. Chủ yếu nó chỉ được sử dụng như một tuyên bố như FOO("function x called");
, nhưng trong một vài trường hợp tôi thấy if (FOO("condition a")) { /* some more debug output */ }
. Với NDEBUG được định nghĩa và tối ưu hóa, không có gì nên được để lại của FOO. Tôi đã không nghĩ ra điều này, nhưng tôi phải dọn dẹp đống lộn xộn này :).
edit2: Tôi nên thêm rằng phát hành gcc xây dựng những lá cờ được sử dụng: O3 Wall -ansi
EDIT3: Để bây giờ tôi đi với __inline int dummy() { return 0; }
. __inline hoạt động với cả VisualC và GCC trong chế độ ansi.
Bạn có thể hiển thị nhiều ví dụ về cách 'FOO() 'được sử dụng trong mã của bạn? – unwind
Bạn có luôn luôn sử dụng giá trị trả về từ, ví dụ: 'printf()'? – pmg
Nếu bạn không nhớ gọi foo() và chỉ muốn chắc chắn giá trị trả về được sử dụng là 0, bạn có thể sử dụng toán tử dấu phẩy và '#define FOO (arg) (foo (arg), 0)' – Eregrith