C语言上#ifdef和#ifndef等宏定义为什么都不分级缩进?

JhonDao 2019-05-22 04:59:28
类似于下面这段代码,如果加上缩进后就好看多了,但是为什么很多大神写的开源代码都不加缩进?


#ifdef SYS16BIT
# define MAXSEG_64K
#endif
#ifdef MSDOS
# define UNALIGNED_OK
#endif

#ifdef __STDC_VERSION__
# ifndef STDC
# define STDC
# endif
# if __STDC_VERSION__ >= 199901L
# ifndef STDC99
# define STDC99
# endif
# endif
#endif
#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus))
# define STDC
#endif
#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__))
# define STDC
#endif
#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32))
# define STDC
#endif
#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__))
# define STDC
#endif
...全文
2629 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
拥抱Linux 2019-05-25
  • 打赏
  • 举报
回复 3
引用 11 楼 JhonDao 的回复:
总共说了两句话,但是一句没在正题上。回答别人的问题就好像打擦边球,似是而非。看起来说的很有道理,但其实啥也没说,你到底知不知道啊?

悄悄告诉你,你发现了一个真相,一个 隐藏 在这个论坛的 公开 的真相!

说回帖子问题,查询了一下,个人觉得大概是两个原因,(1)历史遗留原因,(2)可读性与易分辨的综合作用原因。

(1)历史遗留原因:
远古时期(ANSI-C之前)的C编译器只认 # 位于一行的开头才是宏定义,于是形成了一种风格。尽管后来至今的 C 标准以及编译器早就允许 # 的前面、后面可以有空格,但是还是有很多人有顶格写 # 的习惯, 包括很多文本编辑器的自动缩进方案也是把宏定义的 # 调整为顶格。

(2)可读性与易分辨的综合作用原因:
诚如楼主所言,把宏定义(条件编译命令)的 #ifdef 、#else 、 #endif 等采用 整体 分层缩进的形式,可读性很好,很容易看清楚层次。
不过,就楼主贴出来的代码片段本身,实际上也是采用了分层缩进的形式的呀,只不过不是整体缩进,而是对 # 后面的内容进行缩进而已。俺以为,觉得可读性不高的原因应该是 不同习惯的人,阅读的时候有不适应的感觉吧。这个嘛,还是偏主观方面多一些吧?

另外还有一种情况是宏定义(条件编译命令)不是在文件头部,而是混合在代码中间的情况,如果不顶格而是跟随一般代码采用同样的缩进的话,宏 与 一般代码 混合在一起,才更不容易发现、阅读。比如:

#include <stdio.h>

int main()
{
#ifdef DEBUG
printf("debug");
#else
printf("notdebug");
#endif
return 0;
}



#include <stdio.h>

int main()
{
#ifdef DEBUG
printf("debug");
#else
printf("notdebug");
#endif
return 0;
}

当然了,这第二种情况和楼主说的分层缩进可能不完全是同一个意思,权且顺便一说。

总结一下:俺个人还是觉得这个问题更大的原因在于 个人的编程风格和习惯 ,分层缩进 只要不是在远古级别的编译器里应该都不会出错,所以应该是觉得哪种更顺手、顺眼就使用了哪种吧!一家之言,仅供参考!
JhonDao 2019-05-25
  • 打赏
  • 举报
回复 2
引用 10 楼 赵4老师 的回复:
[quote=引用 5 楼 赵4老师 的回复:]
代码被编译时编译宏的嵌套层次

代码运行时复合语句的嵌套层次
怎么能混为一谈呢?!

天仙投胎到人间前在仙班的座次

天仙投胎到人间后在人间的地位
怎么能混为一谈呢?!
[/quote]总共说了两句话,但是一句没在正题上。回答别人的问题就好像打擦边球,似是而非。看起来说的很有道理,但其实啥也没说,你到底知不知道啊?
赵4老师 2019-05-24
  • 打赏
  • 举报
回复
引用 5 楼 赵4老师 的回复:
代码被编译时编译宏的嵌套层次 和 代码运行时复合语句的嵌套层次 怎么能混为一谈呢?!
天仙投胎到人间前在仙班的座次 和 天仙投胎到人间后在人间的地位 怎么能混为一谈呢?!
636f6c696e 2019-05-24
  • 打赏
  • 举报
回复
编码风格,没有对错
JhonDao 2019-05-24
  • 打赏
  • 举报
回复
引用 5 楼 赵4老师 的回复:
代码被编译时编译宏的嵌套层次

代码运行时复合语句的嵌套层次
怎么能混为一谈呢?!
1.宏定义有可能出现多层次的嵌套,并且宏定义还比较长,至少一屛显示不完。2.前面加缩进不会导致编译问题,至少我的VS2005没出现这个问题。3.结合前面两点,得出结论,宏定义中采用分层缩进会增加代码的易读性。跟什么混为一谈没什么关系。
JhonDao 2019-05-24
  • 打赏
  • 举报
回复
引用 2 楼 袁君元 的回复:
主要用于方便调试程序,举个简单的例子,当你程序有问题的时候,你需要通过输出中间结果来检查问题,当程序很复杂的时候,你输出的中间结果很多,最后调试正确后,你就需要把中间结果注释掉,这个时候用它的话,只需要把中间变量进行宏定义。就可以一次性把所有的中间结果注释掉。
我问的是宏定义的分层缩进,你在回答宏定义的作用。
JhonDao 2019-05-24
  • 打赏
  • 举报
回复
引用 1 楼 stherix 的回复:
因为一般都习惯#和命令挨着写
而#必须顶格
看来你没实际操作过,不清楚到底能不能这么做。
赵4老师 2019-05-23
  • 打赏
  • 举报
回复
代码被编译时编译宏的嵌套层次 和 代码运行时复合语句的嵌套层次 怎么能混为一谈呢?!
六道佩恩 2019-05-22
  • 打赏
  • 举报
回复
我也不知道为什么,我个人分析头文件的时候会习惯修改,加上缩进分层次。
六道佩恩 2019-05-22
  • 打赏
  • 举报
回复
引用 1 楼 stherix 的回复:
因为一般都习惯#和命令挨着写 而#必须顶格
#必须顶格?谁说的?没这回事。难道你在#include "stdio.h"前面敲个空格就没法编译了?
CaptainXue 2019-05-22
  • 打赏
  • 举报
回复
主要用于方便调试程序,举个简单的例子,当你程序有问题的时候,你需要通过输出中间结果来检查问题,当程序很复杂的时候,你输出的中间结果很多,最后调试正确后,你就需要把中间结果注释掉,这个时候用它的话,只需要把中间变量进行宏定义。就可以一次性把所有的中间结果注释掉。
stherix 2019-05-22
  • 打赏
  • 举报
回复
因为一般都习惯#和命令挨着写 而#必须顶格

70,027

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧