Построение строк с помощью макросов препроцессора C

#c

#c

Вопрос:

Следующий код взят из книги C Puzzle (глава Основные типы 1.1.).). Я не могу заставить это работать.

 #include <stdio.h>

#define PRINT(format,x) printf("x = %formatn",x)

int integer = 5;
char character = '5';
char *string = "5";

main(){
    PRINT(d,string); PRINT(d,character); PRINT(d,integer);
    PRINT(s,string); PRINT(c,character); PRINT(c,integer=53);
    PRINT(d, ( '5' > 5 ));

    {
        int sx = -9;
        unsigned ux = -8;
        PRINT(o,sx); PRINT(o,ux);
        PRINT(o, sx>>3); PRINT(o, ux>>3 );
        PRINT(d, sx>>3); PRINT(d, ux>>3 );
    }
}
  

Проблема заключается в макросе в третьей строке: #define PRINT(format,x) printf("x = %formatn",x) .

  • Поддерживают ли текущие (соответствующие стандарту) C-препроцессоры замену внутри строковых литералов?
  • Можете ли вы переопределить макрос, чтобы остальной код работал без каких-либо дальнейших изменений?

Комментарии:

1. Самое загадочное в этой книге то, что они позволяют печатать ее с таким неработающим кодом.

2. @ChristianGibbons Совсем не озадачивает… вы можете найти книги, обосновывающие теорию плоской земли, в разделе «наука»…

Ответ №1:

Вопрос действительно в том, выполнял ли когда-либо какой-либо препроцессор C замену внутри строковых литералов. Я никогда не сталкивался с таким.

Требуется упорядочение с использованием # :

 #define PRINT(format,x) printf(#x " = %" #format "n", (x))
  

Комментарии:

1. В книге C puzzle прямо утверждается, что препроцессор C может это сделать, см. Стр. 23.