Есть ли более простой способ сделать эту работу? - PullRequest
1 голос
/ 19 марта 2011
#include <stdio.h>

#define STR(x) #x
#define STR2(x) STR(x)
#define LINE_FILE ("Line " STR2(__LINE__) " of file " STR2(__FILE__))

int main(void)
{
    const char *str = LINE_FILE;

    printf("%s\n", str);

    return 0;
}

Это единственная схема определения, которая заставит STR (x) напечатать фактические LINE и FILE ???

Ответы [ 3 ]

5 голосов
/ 19 марта 2011
STR2(__FILE__)

__FILE__ уже является строковым литералом: вам не нужно использовать STR2 здесь.

Вам также, вероятно, следует удалить скобки из макроса, чтобы его можно было объединить с другими строковыми литералами, если вы хотите это сделать:

#define LINE_FILE "Line " STR2(__LINE__) " of file " __FILE__
4 голосов
/ 19 марта 2011

printf("Line %d of file %s\n", __LINE__,__FILE__);

0 голосов
/ 19 марта 2011

Не ответ, но, возможно, кто-то может сделать его из этого.Вы можете объединить не только строки в макросе, используя "##"

Но это не работает:

#define LINE_FILE "Line " ## (__LINE__) ## " of file " __FILE__

остальная часть #define взята из James McNellis

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...