首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C预处理器定义替换字符串格式说明符

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

Stack Overflow用户
提问于 2018-05-29 14:32:25
回答 2查看 1.6K关注 0票数 1

我想知道是否可以使用C预处理定义来更改字符串格式说明符。我尝试过编写以下内容,但似乎得到了一个编译器错误。它只是试图用正确的格式说明符替换现有的格式说明符。

代码语言:javascript
复制
#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;    
}

我得到以下编译器错误:

代码语言:javascript
复制
error: expected an identifier
  #define %d %llu
          ^

为什么这个语法是不可接受的?有可能做到吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-29 14:35:29

你想做什么是不可能的。

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

你能做的就是这样:

代码语言:javascript
复制
#if xyz
  #define FMT   "%d"
#else
  #define FMT   "%lli"
#endif

....

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

顺便说一句:通常你不应该需要这个。对于本机类型intlong等,格式说明符应该可以正常使用。

用于固定大小的类型(如int64_t等)在inttypes.h中已经定义了宏

票数 3
EN

Stack Overflow用户

发布于 2018-05-29 14:42:44

有可能做到吗?不,你这样做是不可能的。在陈述中

代码语言:javascript
复制
#define %d %lli 

宏名称必须是有效的标识符

来自C99标准

第6.10.1节定义标识符替换-列表新行并从7.1.13开始

  • 以下划线和大写字母或另一个下划线开头的所有标识符始终保留用于任何用途。
  • 以下划线开头的所有标识符始终保留为在普通和标记名称空间中用作文件范围的标识符。
  • 以下任何一个子子句(包括未来的库指示)中的每个宏名称都保留给指定的使用,如果包含任何关联的标头;除非另有明确说明(请参见7.1.4)。

宏名作为有效标识符.例如,将宏定义为

代码语言:javascript
复制
#define INT_FMT "%d"

然后

代码语言:javascript
复制
 int myInt = 10;
 printf("myInt start value is : "  INT_FMT  "\n", myInt);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50586997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档