Зачем тебе это как строка? Что не так с целым числом? Вот два способа написать logError()
:
#define logError(str) fprintf(stderr, "%s line %d: %s\n", __FILE__, __LINE__, str)
// Or, forward to a more powerful function
#define logError(str) logError2(__FILE__, __LINE__, str)
void logError2(const char *file, int line, const char *str);
Если вам действительно нужна строка в виде строки, вы можете использовать строковый оператор #
, но из-за особенностей работы макросов вам нужно будет обернуть ее в два макроса:
#define STRINGIZE(x) STRINGIZE2(x)
#define STRINGIZE2(x) #x
#define LINE_STRING STRINGIZE(__LINE__)
А теперь LINE_STRING
- это макрос, который будет расширяться до строки, содержащей номер текущей строки, где бы он ни раскрывался. Если бы у вас был только один уровень макросов (т. Е. Если бы у вас было #define STRINGIZE(x) #x
), то вы бы получали буквальную строку "__LINE__"
каждый раз, когда ее расширяли, а это не то, что вам нужно.