c - C 中 3D 循环的宏

标签 c for-loop macros coding-style

我正在开发一个 C (C99) 程序,它在许多地方对 3-D 数组进行大量循环。所以很自然地,以下访问模式在代码中无处不在:

for (int i=0; i<i_size, i++) {
    for (int j=0; j<j_size, j++) {
        for (int k=0; k<k_size, k++) {
            ...
        }
    }
}

自然地,这会使许多代码行变得困惑并且需要大量的复制粘贴。所以我想知道使用宏来使其更紧凑是否有意义,如下所示:

#define BEGIN_LOOP_3D(i,j,k,i_size,j_size,k_size) \
for (int i=0; i<(i_size), i++) { \
    for (int j=0; j<(j_size), j++) { \
        for (int k=0; k<(k_size), k++) { 

#define END_LOOP_3D }}}

一方面,来自 DRY principle从观点来看,这似乎很棒:它使代码更加紧凑,并允许您将循环的内容缩进一个 block 而不是三个。另一方面,引入新语言结构的做法看起来丑陋得可怕,尽管我现在想不出任何明显的问题,但似乎很容易产生错误,调试起来简直是噩梦。

那么您怎么看:尽管存在丑陋和潜在的缺点,但紧凑性和减少的重复是否证明了这一点?

最佳答案

切勿将打开或关闭 {} 放在宏中。 C 程序员不习惯这一点,因此代码变得难以阅读。

在您的情况下,这甚至是完全多余的,您只是不需要它们。 如果你这样做

FOR3D(I, J, K, ISIZE, JSIZE, KSIZE)      \
for (size_t I=0; I<ISIIZE, I++)          \
    for (size_t J=0; J<JSIZE, J++)       \
        for (size_t K=0; K<KSIZE, K++)

不需要终止宏。程序员可以直接放置 {}

另外,上面我使用了 size_t 作为 C 中 for 循环索引的正确类型。 3D 矩阵很容易变大,int 运算溢出。

关于c - C 中 3D 循环的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25131574/

相关文章:

c - 多条件同时测试(C语言)

c - 在 Ubuntu 16.04 上找不到 printf.c

c++ - 有没有办法用#define 替换长 namespace ?

c - 32 位和 64 位系统中的 strcmp 行为

java - 无名变量声明 - 为什么它有效?

Java:查找百分比差异

swift - swift 中的 for-in 循环是如何工作的?

c++ - GCC 的 wchar_t 有多大?

可以在标记粘贴之前扩展宏吗?

c - 每秒发送数据数小于params,如何每秒发送更多数据?