thể trùng lặp:
Can I redefine a C++ macro then define it back?Bảo tồn tiền xử lý các định nghĩa
Nói rằng tôi có một số mã có sử dụng tên BLAH
cho một biến. Giả sử BLAH
là định nghĩa tiền xử lý phổ biến trong nhiều tệp tiêu đề chuẩn (được định nghĩa là 10), vì vậy nếu tệp của tôi được bao gồm sau bất kỳ tệp nào, mã sẽ bị ngắt vì BLAH
được chuyển thành 10; do đó, tôi phải #undef BLAH
. Nhưng các tiêu đề khác có thể phụ thuộc vào BLAH
, vì vậy tôi phải khôi phục BLAH
thành giá trị ban đầu sau khi tiêu đề của tôi hoàn tất. Có thể thực hiện một việc như sau:
#ifdef BLAH
#define BLAH_OLD BLAH
#undef BLAH
#endif
... code ...
// restore BLAH to 10
#ifdef BLAH_OLD
#define BLAH BLAH_OLD
#end
? Điều này không hiệu quả, bởi vì BLAH không được mở rộng đến 10. Tôi đã thử làm một cái gì đó như
#define EXPAND_AGAIN(x) x
#define EXPAND(x) EXPAND_AGAIN(x)
#define BLAH_OLD EXPAND(BLAH)
nhưng điều đó không có tác dụng, vì EXPAND được thực hiện theo nghĩa đen và không được mở rộng. Tôi đang sử dụng MSVC 2008/2010, nhưng nó sẽ là đáng yêu nếu giải pháp sẽ làm việc trên hầu hết các trình biên dịch khác quá.
Bạn đã cân nhắc việc thay đổi tên biến của mình chưa? –
Thay đổi tên biến của bạn; quy ước khủng khiếp mà bạn đã đi đến đó nếu đây là vấn đề. Và làm thế nào về thay vì "chúng ta hãy nói" bạn nói "đây là vấn đề thực tế tôi đang cố gắng giải quyết." – GManNickG
Bạn nhận ra rằng nó đã là một quy ước từ gần đầu thời gian mà các số nhận dạng được tất cả các mũ được dành riêng để sử dụng bởi các bộ xử lý trước (để tránh những thứ như thế này). –