C语言打开文件时,为什么定义文件名的宏不能和文件指针关键字重名?
问题原因说明
C语言的宏定义是预处理阶段的纯文本替换逻辑,不会做语法语义校验,只要字符串匹配就会直接替换,编译失败的核心原因是宏名和标准库保留标识符冲突:
FILE是标准库<stdio.h>中内置的类型别名,属于C标准规定的保留标识符,作用是定义文件流指针的类型,常规代码中的FILE *fp就是用这个内置类型声明文件指针。- 当定义
#define FILE "Distribution.txt"之后,预处理阶段会把代码里所有FILE字符串全部替换为"Distribution.txt",原来的FILE *fp;会被替换为完全不符合C语法规则的代码:
所以代码无法通过编译。"Distribution.txt" *fp; - 第一段代码使用的宏名是
FILENAME,没有和标准库的保留标识符冲突,不会误替换代码里的其他内容,所以可以正常编译。
额外说明:C语言编程时不要用标准库已有的保留标识符作为宏名、变量名或自定义函数名,避免出现这类非预期的替换错误。
内容的提问来源于stack exchange,提问作者Nicholas Wasselle
相关产品推荐
相关产品推荐

