Stringification of a macro value
The xstr
macro defined below will stringify after doing macro-expansion.
#define xstr(a) str(a)#define str(a) #a#define RECORDS_PER_PAGE 10#define REQUEST_RECORDS \ "SELECT Fields FROM Table WHERE Conditions" \ " OFFSET %d * " xstr(RECORDS_PER_PAGE) \ " LIMIT " xstr(RECORDS_PER_PAGE) ";"
#include <stdio.h>#define RECORDS_PER_PAGE 10#define TEXTIFY(A) #A#define _REQUEST_RECORDS(OFFSET, LIMIT) \ "SELECT Fields FROM Table WHERE Conditions" \ " OFFSET %d * " TEXTIFY(OFFSET) \ " LIMIT " TEXTIFY(LIMIT) ";"#define REQUEST_RECORDS _REQUEST_RECORDS(RECORDS_PER_PAGE, RECORDS_PER_PAGE)int main() { printf("%s\n", REQUEST_RECORDS); return 0;}
Outputs:
SELECT Fields FROM Table WHERE Conditions OFFSET %d * 10 LIMIT 10;
Note the indirection to _REQUEST_RECORDS to evaluate the arguments before stringifying them.
Try double escaping your quotes
#define RECORDS_PER_PAGE 10#define MAX_RECORD_LEN 10 /*... */#define DOUBLEESCAPE(a) #a#define ESCAPEQUOTE(a) DOUBLEESCAPE(a)#define REQUEST_RECORDS \ "SELECT Fields FROM Table WHERE Conditions" \ " OFFSET %d * " ESCAPEQUOTE(RECORDS_PER_PAGE) \ " LIMIT " ESCAPEQUOTE(RECORDS_PER_PAGE) ";" char result_buffer[RECORDS_PER_PAGE][MAX_RECORD_LEN];int main(){ char * a = REQUEST_RECORDS;}
compiles for me. The token RECORDS_PER_PAGE
will be expanded by the ESCAPEQUOTE
macro call, which is then sent into DOUBLEESCAPE
to be quoted.