Sử dụng __LINE__
, nhưng loại của nó là gì?
LINE Số dòng giả định (trong tệp nguồn hiện tại) của dòng nguồn hiện tại (một hằng số nguyên).
Là một hằng số nguyên , mã thường có thể giả định giá trị là __LINE__ <= INT_MAX
và kiểu như vậy int
.
Để in trong C, printf()
cần sự xác định phù hợp: "%d"
. Đây là một mối quan tâm ít hơn nhiều trong C ++ với cout
.
Mối quan tâm lớn: Nếu số dòng vượt quá INT_MAX
1 (hơi có thể hình dung được với 16-bit int
), hy vọng trình biên dịch sẽ đưa ra cảnh báo. Thí dụ:
format '%d' expects argument of type 'int', but argument 2 has type 'long int' [-Wformat=]
Ngoài ra, mã có thể buộc các loại rộng hơn chặn các cảnh báo như vậy.
printf("Not logical value at line number %ld\n", (long) __LINE__);
//or
#include <stdint.h>
printf("Not logical value at line number %jd\n", INTMAX_C(__LINE__));
Tránh printf()
Để tránh tất cả các giới hạn số nguyên: stringify . Mã có thể in trực tiếp mà không cần printf()
gọi: một điều tốt để tránh khi xử lý lỗi 2 .
#define xstr(a) str(a)
#define str(a) #a
fprintf(stderr, "Not logical value at line number %s\n", xstr(__LINE__));
fputs("Not logical value at line number " xstr(__LINE__) "\n", stderr);
1 Thực hành lập trình kém chắc chắn để có một tệp lớn như vậy, nhưng có lẽ mã do máy tạo ra có thể tăng cao.
2 Trong gỡ lỗi, đôi khi mã chỉ đơn giản là không hoạt động như mong đợi. Việc gọi các hàm phức tạp như *printf()
tự nó có thể phát sinh vấn đề so với một hàm đơn giản fputs()
.