2012-11-09 28 views
5

Tôi thường có tình huống mà tôi cần một số hằng số được tạo ra tại thời gian biên dịch cho việc sử dụng các phép dịch bit và mặt nạ.Hoạt động toán học trong quá trình xử lý trước biên dịch

ví dụ:

#define blockbits 8 
#define blocksize 256 // could be generated from 2^blockbits 
#define blocksize 0xFF // could be generated from blocksize - 1 

Tôi muốn tất cả những được tạo ra từ blockbits, tuy nhiên không có hoạt động năng lượng có thể được sử dụng trong tiền xử lý mà tôi biết.

Có ai biết một cách đơn giản để tạo ra loại điều này tại thời gian biên dịch không?

+0

"tuy nhiên không có hoạt động nào có thể được sử dụng trong trình xử lý trước mà tôi biết." - thực sự? những gì về sự thay đổi bit? –

+2

BTW là C++ chúng ta đang nói, bất kỳ lý do chính đáng nào cho '# define' thay vì hằng số? – Kos

+0

Đây không phải là một công việc cho 'constexpr'? – DavidO

Trả lời

8

Bạn có thể xác định chúng như biểu thức toán học:

#define blockbits 8 
#define blocksize (1 << blockbits) 
#define blockXXXX (blocksize - 1) // changed from blocksize to blockXXXX, since blocksize is already taken 

Dấu ngoặc là để đảm bảo không có vấn đề ưu tiên điều hành khi bạn sử dụng chúng trong các biểu thức khác.

Bạn cũng có thể muốn đổi tên thành tất cả chữ hoa như BLOCKBITS, BLOCKSIZE, v.v., là quy ước đặt tên C++ để phân biệt các macro từ tên thông thường.

+2

+1, bộ tiền xử lý sẽ thay thế chúng như là và trình biên dịch sẽ tính giá trị. – Kos

0

Nếu bạn muốn sử dụng const thay vì # define và nếu bạn muốn tạo chức năng quyền lực chung (không chỉ cho quyền hạn 2) sẽ tính giá trị khi chạy, bạn cũng có thể thử thực hiện với mẫu như sau:

template<int num, int pow> struct temp_pow 
{ 
    static const unsigned int result=temp_pow<num, pow-1>::result*num; 
}; 

template<int num> struct temp_pow<num, 1> 
{ 
    static const unsigned int result=num; 
}; 

const int BLOCKBITS = 8; 
const int BLOCKSIZE = temp_pow<2,BLOCKBITS>::result; // could be generated from 2^BLOCKBITS 
const int BLOCKSIZE_1 = BLOCKSIZE-1; 
Các vấn đề liên quan