基于ISO C规范:C语言中bool类型的文件I/O是否可按int处理?
关于将bool变量当作int进行文件I/O的规范分析
针对你给出的代码片段,基于ISO C(C99及后续版本)规范,分两部分分析:
1. fprintf(fp1, "%d", b); 符合规范
C99引入了_Bool类型,<stdbool.h>头文件中定义的bool是_Bool的typedef。根据整数提升规则,_Bool类型的变量在作为函数参数传递时会被隐式提升为int类型——true对应1,false对应0。而fprintf的%d转换说明符要求参数为int类型,因此这段代码的行为是明确且符合规范的,会正确输出1或0。
2. fscanf(fp2, "%d", &b); 不符合规范,属于未定义行为
fscanf的%d转换说明符要求对应的参数是指向int类型的指针(int*),但这里传递的是&b,其类型为bool*(即_Bool*)。根据ISO C规范,当转换说明符对应的指针类型与实际传递的指针类型不兼容时,行为是未定义的。
虽然在某些编译器下这段代码可能“正常工作”,但这只是特定实现的行为,并非标准所保证。正确的做法是先用一个int变量接收输入,再转换为bool类型:
int temp; if (fscanf(fp2, "%d", &temp) == 1) { b = (temp != 0); }
内容的提问来源于stack exchange,提问作者apadana
相关产品推荐
相关产品推荐

