亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

宏值的字符串化

宏值的字符串化

C
呼喚遠方 2019-08-09 10:24:33
宏值的字符串化我遇到了一個問題 - 我需要使用宏值作為字符串和整數。 #define RECORDS_PER_PAGE 10  /*... */  #define REQUEST_RECORDS \      "SELECT Fields FROM Table WHERE Conditions" \      " OFFSET %d * " #RECORDS_PER_PAGE \       " LIMIT " #RECORDS_PER_PAGE ";"  char result_buffer[RECORDS_PER_PAGE][MAX_RECORD_LEN];  /* ...and some more uses of RECORDS_PER_PAGE, elsewhere... */這失敗了一條關于“stray?!钡南?,即使它有效,我想我會得到字符串化的宏名稱,而不是值。當然,我可以將值提供給最終的方法("LIMIT %d ", page*RECORDS_PER_PAGE),但它既不漂亮也不高效。當我希望預處理器不以特殊方式處理字符串并且像普通代碼一樣處理它們的內容時,就像這樣。就目前而言,我對它進行了解決,#define RECORDS_PER_PAGE_TXT "10"但可以理解的是,我對它并不滿意。怎么做對嗎?
查看完整描述

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) ";"


查看完整回答
反對 回復 2019-08-09
?
肥皂起泡泡

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以在對字符串進行字符串化之前評估參數。


查看完整回答
反對 回復 2019-08-09
?
尚方寶劍之說

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引用中。


查看完整回答
反對 回復 2019-08-09
  • 3 回答
  • 0 關注
  • 563 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號