- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在研究 netstat 工具 (Linux) 的代码,AFAIK 主要读取 /proc/net/tcp
文件并从中打印出来。 (我现在的重点是 -t 模式。)
我对作者选择的编码风格有点困惑:
static int tcp_info(void)
{
INFO_GUTS6(_PATH_PROCNET_TCP, _PATH_PROCNET_TCP6, "AF INET (tcp)", tcp_do_one);
}
在哪里
#define INFO_GUTS6(file,file6,name,proc) \
char buffer[8192]; \
int rc = 0; \
int lnr = 0; \
if (!flag_arg || flag_inet) { \
INFO_GUTS1(file,name,proc) \
} \
if (!flag_arg || flag_inet6) { \
INFO_GUTS2(file6,proc) \
} \
INFO_GUTS3
在哪里
#define INFO_GUTS3 \
return rc;
和
#if HAVE_AFINET6
#define INFO_GUTS2(file,proc) \
lnr = 0; \
procinfo = fopen((file), "r"); \
if (procinfo != NULL) { \
do { \
if (fgets(buffer, sizeof(buffer), procinfo)) \
(proc)(lnr++, buffer); \
} while (!feof(procinfo)); \
fclose(procinfo); \
}
#else
#define INFO_GUTS2(file,proc)
#endif
等等
很明显,我的编码意识倾斜并说“那些应该是函数”。我看不到这些宏在这里带来的任何好处。它会破坏可读性等。
周围是否有人熟悉此代码,能否阐明此处“INFO_GUTS”的含义以及是否可能(或仍然)存在这种奇怪的编码风格的原因?
如果您对它们的使用感到好奇,完整的依赖关系图如下所示:
# /---> INFO_GUTS1 <---\
# INFO_GUTS --* INFO_GUTS2 <----*---- INFO_GUTS6
# î \---> INFO_GUTS3 <---/ î
# | |
# unix_info() igmp_info(), tcp_info(), udp_info(), raw_info()
最佳答案
你认为“那些宏应该是函数”对我来说似乎是正确的;我更愿意将它们视为函数。
了解宏的使用频率会很有趣。然而,它们被使用得越多,如果它们是一个真正的函数而不是一个宏,就应该越节省空间。宏相当大并且使用(本来就很慢的)I/O 函数本身,因此使用宏不会提高速度。
现在,如果您想要函数的内联替换,您可以在 C(以及 C++)中使用 inline
函数。
您还可以争辩说 INFO_GUTS2 应该使用直接的 while
循环而不是 do ... while
循环;如果是,它只需要检查一次 EOF:
while (fgets(buffer, sizeof(buffer), procinfo))
(*proc)(lnr++, buffer);
实际上,如果 channel 上出现错误(与 EOF 不同),代码可能会进入无限循环; fgets()
会失败,但是 feof()
会返回 false(因为它还没有达到 EOF;它遇到了错误 - 请参阅 ferror( )
),这样循环就会继续。不是一个特别合理的问题;如果文件打开,您很少会遇到错误。但是一个可能的问题。
关于c - 为什么这些 C 宏不写成函数呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7158716/
在 Erlang 中,使用 =>要比较两个变量会导致语法错误,您必须使用 >=反而: 1> 10 => 5. * 1: syntax error before: '>' 2> 10 >= 5. tru
在少数情况下,日期写为“created ca.”。 1858-60',人类读者会将其理解为“约 1858-1860 年创建”。 因此,想象两个代表年的整数。 a = 1858 b = 60 我希望能够
是否可以用经典的 asp 写出我得到的带有字母的输出整数? 例如,如果我的结果是 5,我想输出“五” 或者如果是二十,我需要它显示“二十” 结果可能是无限的,因此编写一个用于查找目的的数组是行不通的。
这就是我正在做的,我读取了一个 .mp3 文件,以这种方式将其转换为 Base64String: using (fileStream) {
是否有任何算法可以找出有多少种方法可以写出一个数字,例如 n ,其总和为 2 ? 例如:对于 4 有四种方法: 4 = 4 4 = 2 + 2 4 = 1 + 1 + 1 + 1 4 = 2 + 1
我正在尝试 transform()一个Dataset在 Java 中如下所示: Function1,Dataset> withDoubled = (Dataset numbers) -> number
这个问题在这里已经有了答案: Convert integer to hexadecimal and back again (11 个答案) 关闭 7 年前。 在 c# 中,我将错误代码定义为 pub
如何使用 Flink 将 DataSet 作为 Parquet 文件写入 s3 bucket。是否有像 spark 这样的直接函数:DF.write.parquet("write in parquet
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 3 年前。 Improve
在CLRS中,作者通过以下伪代码介绍了红黑树中的旋转操作: LEFT-ROTATE(T, x) y = x.right # Line 1 x.right = y.left
我是一名优秀的程序员,十分优秀!