2010-07-07 35 views
10

Nếu một giá trị được định nghĩa làKích thước của #define giá trị

#define M_40 40

Là kích thước giống như một short (2 byte) hoặc là nó như là một (byte 1) char hoặc int (4 byte)?

Kích thước có phụ thuộc vào việc bạn là 32 bit hay 64 bit không?

+0

Ai nói một 'short' sẽ là 2 byte hoặc' int' sẽ là 4 byte? Đây là những đảm bảo duy nhất bạn có: http://stackoverflow.com/questions/271076/what-is-the-difference-between-an-int-and-a-long-in-c/271132#271132 – GManNickG

+0

@GMan : Tốt liên kết .. Trong trình biên dịch của tôi và môi trường, nó là 2 byte vì vậy tôi cần phải làm rõ .. cảm ơn –

+4

Câu hỏi này được gắn thẻ với C + +, vì vậy tôi giả định đó là những gì lập trình của bạn. Không có lý do chính đáng để sử dụng '# define' cho loại điều này trong C++. Chỉ cần viết 'const int M_40 = 40;' và được thực hiện với nó. Sau đó bạn có thể thay đổi 'int' thành' short' hoặc 'char' hoặc bất cứ thứ gì bạn thích nếu bạn quan tâm đến kích thước. Ngoài ra, đó là loại thiếu điểm của hằng số được đặt tên nếu tên của hằng số chỉ là giá trị của nó. Viết 'foo (M_40)' không có ý nghĩa rõ ràng hơn 'foo (40)'. –

Trả lời

28

#define không có kích thước vì nó không phải là loại mà là văn bản thuần thay thế vào mã C++ của bạn. #define là một chỉ thị tiền xử lý và nó chạy trước khi mã của bạn thậm chí bắt đầu được biên dịch.

Kích thước trong mã C++ sau khi thay thế là bất kể kích thước của biểu thức hoặc mã C++ mà bạn có ở đó. Ví dụ nếu bạn hậu tố với L như 102L thì nó được xem là dài, nếu không không có hậu tố, chỉ cần một int. Vì vậy, 4 byte trên x86 và x64 có lẽ, nhưng điều này là phụ thuộc trình biên dịch.

lẽ Integer phần đen chuẩn C++ sẽ xóa nó lên cho bạn (Phần 2.13.1-2 của chuẩn C++ 03):

Các loại một số nguyên đen phụ thuộc vào mẫu của nó , giá trị và hậu tố. Nếu nó là số thập phân và không có hậu tố, nó có loại đầu tiên trong số các loại này có giá trị của nó có thể được biểu diễn: int, long int; nếu giá trị không thể là được biểu thị dưới dạng int dài, hành vi không được xác định. Nếu nó là bát phân hoặc hệ thập lục phân và không có hậu tố, nó có loại đầu tiên trong đó giá trị của nó có thể được biểu diễn: int, int unsigned, long int, unsigned long int. Nếu nó bị u hoặc U hậu tố, loại là loại đầu tiên trong số các loại này trong số , giá trị của nó có thể được biểu thị: int không dấu, unsigned long int. Nếu nó là hậu tố của l hoặc L, loại của nó là đầu tiên của các loại trong đó giá trị của nó có thể được biểu diễn: dài int, unsigned long int. Nếu đó là hậu tố bởi ul, lu, uL, Lu, Ul, Lu, UL, hoặc LU, loại của nó là unsigned long int

+1

Ước gì tôi có thể +1 một lần nữa cho báo giá chuẩn, rất hữu ích. – GManNickG

7

Một số nguyên đơn giản sẽ được ngầm đúc để int trong tất cả các tính toán và bài tập.

#define chỉ cần thông báo cho bộ xử lý trước để thay thế tất cả các tham chiếu đến biểu tượng bằng một thứ khác. Điều này giống với việc tìm kiếm toàn cầu thay thế mã của bạn và thay thế M_40 bằng 40.

+0

+1 Tìm kiếm thay thế toàn cầu là giải thích rõ ràng nhất, thân thiện với người mới nhất –

2

Giá trị #define không có kích thước, cụ thể. Nó chỉ là thay thế văn bản. Nó phụ thuộc vào bối cảnh của nơi (và cái gì) đang được thay thế.

Trong ví dụ của bạn, nơi bạn sử dụng M_40, trình biên dịch sẽ thấy 40 và thường xử lý như trong int.

Tuy nhiên, nếu chúng ta có:

void SomeFunc(long); 

SomeFunc(M_40); 

Nó sẽ được coi như một chặng đường dài.

+1

Không phải lúc nào cũng vậy. Và hằng số '40' sẽ vẫn là một' int' trong mã ví dụ của bạn. Tuy nhiên, giá trị '40' sẽ được thăng thành' long' khi gọi hàm. Nhưng '40' hằng số vẫn là một' int'. – GManNickG

+0

@GMan: Tại sao nó vẫn là một int mặc dù nó có thể là một char 1 byte đơn giản? Chỉnh sửa (Có Tôi biết char không nhất thiết phải là 1 byte) –

+0

@GMan: #define L (X) X ## L L (M_40) bây giờ là một thời gian dài. #define S (X) #X S (M_40) bây giờ nó là một char *, đó là lý do tại sao tôi nói "thường". –

1

Bộ tiền xử lý chỉ thực hiện thay thế văn bản đơn giản, vì vậy thực tế là hằng số của bạn nằm trong một #define không quan trọng. Tất cả các tiêu chuẩn C nói là "Mỗi hằng số phải có một loại và giá trị của một hằng số phải nằm trong phạm vi các giá trị biểu thị cho loại của nó." C++ có khả năng không thay đổi quá nhiều so với điều đó.

+0

Đi xa hơn, điều gì làm cho C++ truyền giá trị vào 'int' thay vì char khi 40 là giá trị chấp nhận được, ví dụ, unsigned char vì nó nằm trong khoảng từ 0 đến 255? –

+3

@Changeling: Dựa trên các quy tắc chuẩn C++. –

2

Macro tiền xử lý được chuyển đổi theo nghĩa đen trong giai đoạn tiền xử lý của quá trình biên dịch.

Ví dụ mã

#define N 5 

int value = N; 

sẽ được hoán đổi cho

int value = 5; 

khi trình biên dịch thấy nó. Nó không có kích thước của riêng nó như vậy

Các vấn đề liên quan