Điều này sử dụng hai phần mở rộng GCC — câu lệnh biểu hiện ({ ... })
và typeof()
.
- Dòng đầu tiên của việc mở rộng khai báo biến có tên là
type
.
- Dòng thứ hai của việc mở rộng khai báo biến có cùng loại với biến hoặc biểu thức
x
.
- Dòng thứ ba so sánh hai con trỏ, sẽ chỉ khớp nếu các loại của hai biến giả phù hợp, tạo ra cảnh báo con trỏ không khớp (hoặc lỗi nếu biên dịch với
-Werror
).
- Dòng cuối cùng (chứa số
1
) là giá trị của biểu thức — tương đương với đúng.
Vì vậy, bạn nhận được cảnh báo/lỗi biên dịch nếu loại x
không giống với loại được đặt tên.
Ví dụ mã:
#include <stdio.h>
#define typecheck(type,x) \
({ type __dummy; \
typeof(x) __dummy2; \
(void)(&__dummy == &__dummy2); \
1; \
})
int main(void)
{
int x;
if (typecheck(int, x))
printf("int x OK\n");
if (typecheck(double, x))
printf("double x OK\n");
return(0);
}
nhắn Compilation:
$ /usr/bin/gcc -O3 -g -std=gnu99 -Wall -Wextra xx.c -o xx
xx.c: In function ‘main’:
xx.c:15: warning: comparison of distinct pointer types lacks a cast
$
Lưu ý rằng vì tôi không sử dụng -Werror
, mã biên soạn 'OK'. Đầu ra là:
int x OK
double x OK
Nguồn
2012-05-01 05:30:05
char buffer_array [10]; char * buffer_point; typecheck (typeof (& buffer_array), buffer_point) cung cấp cho waring "so sánh các kiểu con trỏ riêng biệt thiếu một dàn diễn viên". loại & buffer_array mà không phải là char *? – DaVid
Với 'char buffer_array [10];', kiểu '& buffer_array' là 'con trỏ tới mảng của' 'char'', hoặc' char (*) [10] '. Mảng không phải là con trỏ; chúng có liên quan chặt chẽ, nhưng chúng không giống nhau. –
nhận được nó。 typeof (& buffer_array [0]) == typeof (buffer_point) – DaVid