C预处理器定义替换字符串格式说明符

时间:2018-05-29 14:32:26

标签: c string format preprocessor 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
          ^

为什么这种语法不被接受?甚至可以完成吗?

2 个答案:

答案 0 :(得分:3)

你想做的事情是不可能的。

宏不会在字符串文字中替换,有效标识符名称的规则也适用于宏名称。

你能做的是这样的事情:

new Audio("notif.mp3").play();

顺便说一句: 通常你不应该这样。对于本机类型#if xyz #define FMT "%d" #else #define FMT "%lli" #endif .... printf("myInt start value: " FMT "\n", myInt++); int等,格式说明符应该可以正常使用。

对于具有固定大小的类型(例如long等),inttypes.h

中已定义了宏

答案 1 :(得分:0)

甚至可以完成吗?不,它不可能像你一样。在声明中

#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);
相关问题