Я хочу написать функцию, которая будет печатать сообщения об ошибках/предупреждения в моей программе вместе с файлом & номер строки. Есть эти два макроса в C:Чистая функция вывода отладки?
__FILE__
__LINE__
но есть проблема, на мой взгляд ... Когда я пишу функцию, как это:
#include <stdio.h>
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
#define AT __FILE__ ":" TOSTRING(__LINE__)
void error(const char *location, const char *msg)
{
#ifdef DEBUG
printf("Error at %s: %s\n", location, msg);
#endif
}
int main(int , char**)
{
error(AT, "fake error");
return 0;
}
Есть еще много бесполезные вызовы функций & trash (значения __FILE__
и __LINE__
при каждом вызове) в двоичном файле, даже если я не могу определить DEBUG
для сборки релиза. Итак, как я могу сделать это более элегантным? Я хочу что-то вроде этого:
#include <stdio.h>
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
#define AT __FILE__ ":" TOSTRING(__LINE__)
void error(const char *location, const char *msg)
{
printf("Error at %s: %s\n", location, msg);
}
int main(int , char**)
{
#ifdef DEBUG
error(AT, "fake error");
#endif
return 0;
}
Но не писать #ifdef DEBUG
и #endif
до и после каждого вызова функции - это было бы слишком огромно для такой задачи. И удалить каждый звонок error(AT, "fake error");
вручную тоже не очень элегантный ...
Любые идеи? Может быть, встроенная функция (не помогла бы, не так ли?) Какой-то макрос или изменение этой конструкции?
Это для C99 или C++ 0x, и будет лучше определен '#define eprintf (...) do {fprintf (stderr,"% s:% d: ", __FILE__, __LINE__); fprintf (stderr, __VA_ARGS__)} while (0) '; обратите внимание на утверждения, заключенные в 'do {...} while (0)', и (более точно) 'fprintf (stderr, __VA_ARGS __)', который позволяет передавать необработанную строку без дополнительных аргументов. –
ya я знаю, tats, почему я написал, он будет похож на предыдущий оператор. – Rozuur
Просто попробовал, и там отсутствует ';' после '__VA_ARGS __)' иначе это действительно приятное решение! – lfxgroove