C99'da (ve GNU uzantıları aracılığıyla) varyantik makroların eklendiğini biliyorum.Varyant makroları ANSI C
böyle bir şey ile geldim ANSI C. güzel bir alternatif var olup olmadığını merak ettik, ama yine de biraz garip:
böyle çağrılabilir Böylecevoid log_info(const char *file, int line, const char *fmt, ...)
{
#ifdef DEBUG
va_list ap;
char newfmt[1024] = { 0 };
va_start(ap, fmt);
sprintf(newfmt, "[INFO] (%s:%d): %s\n", file, line, fmt);
vfprintf(stderr, newfmt, ap);
va_end(ap);
#endif
}
Bu:
log_info(__FILE__, __LINE__, "info message: %s %d", "helloworld", 12);
bu yaklaşımla yanlış bir şey ancak bunu yapmanın daha güzel bir yol olup olmadığını merak ediyorum, yoktur? Örneğin. her zaman dosya/satır belirtmeye gerek yok.
Herhangi bir geri bildirim için teşekkür ederiz.
Düzenleme: Burada ANSI C ile C89 demek istiyorum.
Düzenleme: Aşağıdaki yanıt gayet iyi ama inanıyorum ki, yazdırma komutunun çalıştırılmasını gerektirdiğinden, bazı iş parçacığı güvenliği sorunları olabileceğinden emin olabilirsiniz.
#define __FL__ __FILE__, __LINE__
ve benzeri komutu: Diğer bir alternatif (aynı zamanda oldukça çirkin) yazarak en aza indirmek için tanımlar kullanmak olabilir
log_info(__FL__, "info message: %s %d", "helloworld", 12);
Ne tür bir durumda, varyantik makroları desteklemeyen bir derleyiciyle C yazıyor olabilirsiniz? –
@Alexis King: Yanıt için teşekkürler. Örneğin, C89 bir şirket standartları veya belirli bir proje tarafından bir gereksinim olduğunda mı? Derleyicilerin çoğunun -ansi bayrağıyla bile kodu derleyeceğini biliyorum ve sorum, neden umursamam gerektiği değil, bu tür kısıtlamalar altında olsam ve yine de işlevselliğe ihtiyaç duyarsam ne yapmalıyım? Daha çok merak konusu, kabul etmeliyim. – Alex
Arabellek taşmaları önlemek için lütfen snprintf (newfmt, sizeof (newfmt), "…",…) 'kullanın. Yine de (ikinci düşüncelerde), eğer C99'unuz yoksa, snprintf() 'e sahip olmayabilirsiniz. Bu tam olarak doğru değil - MSVC çoğunlukla C89 ama kütüphaneler arasında snprintf() bulunur. En azından, eğer yapabiliyorsanız 'snprintf()' kullanın. –