簡體   English   中英

C預處理器定義替換字符串格式說明符

[英]C preprocessor define to replace string format specifier

我想知道是否可以使用C預處理定義來更改字符串格式說明符。 我已經嘗試編寫以下內容,但似乎得到了編譯器錯誤。 它只是試圖用正確的格式說明符替換現有的格式說明符。

#include <stdio.h>

//This is the problem line....
#define %d %llu    

int main(int argc, char** argv){
    unsigned long long int myInt = 0;

    printf("myInt start value: %d", myInt++);
    printf("myInt value=%d (that got incremented)", myInt++);
    printf("myInt value: %d; wow, another post-increment", myInt++);
    printf("myInt final value %d", myInt);

    return 0;    
}

我得到以下編譯器錯誤:

error: expected an identifier
  #define %d %llu
          ^

為什么這種語法不可接受? 甚至可以完成嗎?

你想做什么是不可能的。

字符串文字中不會替換宏,有效標識符名稱的規則也適用於宏名稱。

你能做的是這樣的:

#if xyz
  #define FMT   "%d"
#else
  #define FMT   "%lli"
#endif

....

printf("myInt start value: " FMT "\n", myInt++);

順便說一下:通常你不需要這個。 對於本機類型intlong等,格式說明符應該可以正常使用。

對於具有固定大小的類型(例如int64_t等),已經在inttypes.h中定義了宏

甚至可以完成嗎? 不,你的方式不可能。 在聲明中

#define %d %lli 

宏名稱必須是有效的標識符

C99標准

第6.10.1節

 # define identifier replacement-list new-line 

從7.1.13開始

  • 所有以下划線開頭的標識符以及大寫字母或另一個下划線始終保留用於任何用途。
  • 所有以下划線開頭的標識符始終保留用作普通和標記名稱空間中具有文件范圍的標識符。
  • 如果包含任何相關標頭,則保留以下任何子條款中的每個宏名稱(包括未來的庫方向)以供指定使用; 除非另有明確說明(見7.1.4)。

宏名稱設為有效標識符。 例如,將宏定義為

#define INT_FMT "%d"

接着

 int myInt = 10;
 printf("myInt start value is : "  INT_FMT  "\n", myInt);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM