2011-02-07 28 views
5

Có thể làm một cái gì đó như thế này:vĩ mô phụ thuộc vĩ mô

#define F(x) \ 
    #ifdef DOUBLE \ 
     2*x \ 
    #else \ 
     x \ 
    #endif 

để khi tôi sử dụng F, những gì nó mở rộng tới phụ thuộc vào việc vĩ mô DOUBLE được xác định? Tôi không nghĩ như vậy, nhưng tôi hy vọng. GNU mở rộng là tốt.

Chỉnh sửa Để trả lời một số câu trả lời, tôi thực sự sử dụng tính năng này để tạo mã, tùy thuộc vào nơi mã được xác định. Bởi vì thứ tự mà trong đó một số tập tin được bao gồm và nơi mà các macro có liên quan cần phải được xác định, chuyển đổi nó xung quanh theo cách đó đòi hỏi một chút bao thanh toán. Tôi có thể phải làm điều đó, nhưng sẽ rất vui mừng nếu tôi không phải tự làm bản thân mình khỏi góc này!

Trả lời

8

Nếu chúng ta có thể hạn chế được vấn đề, bạn có thể thực hiện điều này. Cụ thể, nếu bạn có thể đảm bảo rằng DOUBLE hoặc là

  • không được định nghĩa như một vĩ mô, hoặc
  • được định nghĩa là một macro mở rộng một chuỗi thẻ trống (ví dụ #define DOUBLE),

sau đó bạn có thể sử dụng một cách tiếp cận gián tiếp với nối mã thông báo: ví dụ

#define F_IMPL_(x)  DOUBLE_IS_DEFINED 
#define F_IMPL_DOUBLE(x) DOUBLE_NOT_DEFINED 

#define F_1(x, m) F_2(x, m) 
#define F_2(x, m) F_IMPL_ ## m (x) 

#define F(x) F_1(x, DOUBLE) 

cách sử dụng:

F(t) 
#define DOUBLE 
F(t) 

Kết quả sau khi tiền xử lý:

DOUBLE_NOT_DEFINED 
DOUBLE_IS_DEFINED 

Cách tiếp cận này cũng sẽ có tác dụng nếu DOUBLE (nếu nó được định nghĩa) được định nghĩa là một macro mở rộng một mã thông báo đơn đã biết, nếu thẻ có thể hình thành một phần của số nhận dạng (ví dụ: TRUE hoặc 1). Để xử lý việc này, bạn chỉ cần đổi tên macro F_IMPL_ thành F_IMPL_{TOKEN} (ví dụ: F_IMPL_TRUE hoặc F_IMPL_1).

+0

Điều đó thật hoàn hảo. –

+0

Công việc tuyệt vời. Tôi ghét phải duy trì nó mặc dù. – AShelly

13

Có gì sai với

#ifdef DOUBLE 
    #define F(x) (2 * (x)) 
#else 
    #define F(x) (x) 
#endif 
4

Tại sao không làm nesting cách khác xung quanh?

#ifdef DOUBLE 
#define F(x) (2*(x)) 
#else 
#define F(x) (x) 
#endif 
3

No. Điều gần nhất bạn có thể làm là đặt tệp tiêu đề và #include tệp tiêu đề đó mỗi khi định nghĩa bạn quan tâm thay đổi. Điều này đôi khi được gọi là mẫu "X", bởi vì X được sử dụng làm macro thay đổi định nghĩa.

Ví dụ, một sử dụng phổ biến của mô hình đó là để autogenerate tên chuỗi các giá trị enum:

// File myenum_values.h 
// NOTE: _no_ header guards so we can include this file multiple times 
X(Apple) 
X(Orange) 
X(banana) 

// File myenum.h 
enum Fruit 
{ 
#define X(x) x, 
#include "myenum_values.h" 
} 

const char *FruitNames[] = 
{ 
#undef X 
#define X(x) #x, 
#include "myenum_values.h" 
}; 

// We now have an array of fruit names without having to define the enum twice 
Các vấn đề liên quan