3 回答

TA貢獻1757條經驗 獲得超7個贊
下面xstr定義的宏將在進行宏擴展后進行字符串化。
#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) ";"

TA貢獻1829條經驗 獲得超6個贊
#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;
}
輸出:
SELECT Fields FROM Table WHERE Conditions OFFSET %d * 10 LIMIT 10;
注意間接到_REQUEST_RECORDS以在對字符串進行字符串化之前評估參數。

TA貢獻1788條經驗 獲得超4個贊
嘗試雙重轉義你的報價
#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;
}
編譯給我。令牌RECORDS_PER_PAGE將通過ESCAPEQUOTE宏調用進行擴展,然后將其發送到DOUBLEESCAPE引用中。
- 3 回答
- 0 關注
- 563 瀏覽
添加回答
舉報