printf в макросе в C - PullRequest
       2

printf в макросе в C

1 голос
/ 20 декабря 2011

у меня есть макрос как таковой

#define PTF(A,y)    fprintf(file,"%s",A,y);printf("%s %d",A,y);

, чтобы он печатал в файл и на консоль так, например, я вызываю эту макрофункцию

int y=9;
PTF("\nRound %d \n",y);

таким образом, мне нужно, чтобы y = 9 отображался как часть аргумента A, поэтому мой fprintf в файле будет выглядеть ниже

Round 9

потому что мне нужно внести много изменений, если я должен это изменить, поэтому надеюсь на легкий выход =)

Ответы [ 5 ]

4 голосов
/ 20 декабря 2011

Макросы - неправильный способ сделать это;особенно в этой конструкции, вы столкнетесь со всеми существующими макросами.Представьте себе:

if(condition)
    PTF("%s", foo);

Просто напишите переменную функцию:

void
ptf(char *fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    vprintf(fmt, ap);
    va_end(ap);
    va_start(ap, fmt);
    vfprintf(file, fmt, ap);
    va_end(ap);
}
1 голос
/ 20 декабря 2011

Изменение

#define PTF(A,y) fprintf(file,"%s",A,y);printf("%s %d",A,y);

до

#define PTF(A,y) fprintf(file,A,y);printf("%s %d",A,y);

Примечание:

PTF("Round %d",9); будет иметь fprint запись Round 9 в файл, но printf все равно покажет Round %d 9.

Вы также должны убедиться, что указали только один спецификатор для fprintf

0 голосов
/ 20 декабря 2011

Обычная идиома - использовать do { ... } while (0) (некоторые компиляторы генерируют предупреждение для этого) или оператор запятой , и заключать ваши операторы в круглые скобки (но вы не можете использовать и управлять оператором потока).

Если вы можете рассчитывать на наличие современного компилятора (например, GCC 3+), вы можете использовать переменные макросы для определения макроса так, чтобы он был похож на обычный printf.

Я бы пошел начто-то вроде:

#define PTF(...) (fprintf(file,__VA_ARGS__),printf(__VA_ARGS__))

, так что PTF("Round %d",y) напечатает Round 9 (при условии, что y = 9) как на file, так и на stdout.

Обычное предупреждение на стороне-эффекты в макросах применяются: никогда, никогда не используйте PTF("%d",y++).

0 голосов
/ 20 декабря 2011

Если вы используете Unix (BSD / Linux / Solaris / и т. Д.), Возможно, для этого проще использовать tee .

0 голосов
/ 20 декабря 2011

Я думаю, что это должно работать ->

#define PTF(A,...) fprintf(file,A,##__VA_ARGS__); printf(A,##__VA_ARGS__);

int y = 9;
PTF("\nRound %d \n",y);

Ссылка Variadic Macros - http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html

...