Почему мой макрос не компилируется?
#define LINE_FILE ("Line"#__LINE__"of file"__FILE__)
int main(void)
{
printf("%s", LINE_FILE);
}
Что я ожидал:
LINE_FILE = "Линейный номер строки имени файла "
а также printf()
может вывести эту строку.
http://ww2.sinaimg.cn/large/005FchG6gw1esb0pvwxr3j30he06jjt7.jpg
4 ответа
__LINE__
не расширяется до "строки", но до int
,
Чтобы обойти это, вы можете сделать следующее:
#define _LINE_FILE2(filename, linenumber) "Line " #linenumber " of " filename
#define _LINE_FILE1(filename, linenumber) _LINE_FILE2(filename, linenumber)
#define LINE_FILE _LINE_FILE1(__FILE__, __LINE__)
Дальнейшие (gcc) подробности о
- предопределенные макросы: https://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html
- stringification: https://gcc.gnu.org/onlinedocs/cpp/Stringification.html
Вам нужен помощник stringify
#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)
затем
#define LINE_FILE ("Line" STR(__LINE__)"of file"__FILE__)
Для отладки макроса вы можете использовать отдельный препроцессор Си.
linenumber.c
#define LINE_FILE_WRONG ("Line"#__LINE__"of file"__FILE__)
// solution of LPs
#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)
#define LINE_FILE ("Line " STR(__LINE__) " of file " __FILE__)
LINE_FILE_WRONG
LINE_FILE
Запустите препроцессор C для этого файла и получите
% cpp linenumber.c
# 1 "linenumber.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "linenumber.c"
("Line"#8"of file""linenumber.c")
("Line " "9" " of file " "linenumber.c")
AFAIK, вы не можете сделать это на препроцессоре, обычным способом является:
printf("Line %d of file %s", __LINE__, __FILE__);