[英]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++);
順便說一下:通常你不需要這個。 對於本機類型int
, long
等,格式說明符應該可以正常使用。
對於具有固定大小的類型(例如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.