Kullanın __LINE__
, ama türü nedir?
HAT Geçerli kaynak satırının (bir tam sayı sabiti) varsayılan satır numarası (geçerli kaynak dosyası içinde).
Bir tamsayı sabiti olarak , kod genellikle değerin __LINE__ <= INT_MAX
ve türünün olduğunu varsayabilir int
.
C baskı için, printf()
eşleştirme belirtici gerekir: "%d"
. Bu, C ++ ile çok daha az endişe kaynağıdır cout
.
Bilgiçlik endişe: satır numarası aşarsa INT_MAX
1 (16 bit ile biraz düşünülebilir int
), umutla derleyici, bir uyarı üretecektir. Misal:
format '%d' expects argument of type 'int', but argument 2 has type 'long int' [-Wformat=]
Alternatif olarak kod, daha geniş türleri bu tür uyarıları önlemeye zorlayabilir.
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__));
Önlemek printf()
Tüm tamsayı sınırlamalarını önlemek için: stringify . Kod, bir printf()
arama olmadan doğrudan yazdırılabilir : hata işlemede kaçınılması gereken güzel bir şey 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 Bu kadar büyük bir dosyaya sahip olmak için kesinlikle zayıf programlama uygulaması, ancak belki de makine tarafından üretilen kod yüksek olabilir.
2 Hata ayıklamada, bazen kod umulduğu gibi çalışmaz. Gibi karmaşık işlevleri çağırmak *printf()
, basit yerine sorunlara neden olabilir fputs()
.