1

我想知道是否可以使用 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
          ^

为什么这种语法不可接受?甚至有可能实现吗?

4

2 回答 2

3

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

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

你可以做的是这样的:

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

....

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

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

对于具有固定大小的类型(例如int64_t等),已经在inttypes.h中定义了宏

于 2018-05-29T14:35:29.533 回答
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);
于 2018-05-29T14:42:44.540 回答