奇怪的宏观行为

时间:2015-11-24 20:29:49

标签: c macros c-preprocessor

这是我的源代码:

for(j=0; j<n-1; j++) {
    printf("(%d %d)->(%d) {%1.9lf < %1.9lf }\n", j+1, j, j + n*(j+1), A[j + n*(j+1)], epsilon*norm);
    printf("(%d %d)->(%d) {%1.9lf < %1.9lf }\n", j+1, j, idx(n, j+1, j), A[idx(n, j+1, j)], epsilon*norm);
    if(A[idx(n,j+1,j)] < epsilon*norm) {
        A[idx(n,j+1,j)] = 0;
    }
  }

这是我的idx宏:

#define idx(__n__, __i__, __j__) __j__ + __n__*(__i__)

在我看来,第2行,第3行代码必须产生相同的输出,但事实并非如此。相反,我得到这样的输出(n等于5):

(1 0)->(5) {5.393394651 < 0.000000000 }
(1 0)->(1) {6.171880741 < 0.000000000 }
(2 1)->(11) {2.966791392 < 0.000000000 }
(2 1)->(7) {2.850418342 < 0.000000000 }
(3 2)->(17) {3.370025863 < 0.000000000 }
(3 2)->(13) {4.128639694 < 0.000000000 }
(4 3)->(23) {0.290962836 < 0.000000000 }
(4 3)->(19) {0.147772573 < 0.000000000 }

我尝试使用标志E运行gcc以查看预处理器对代码执行的操作,但我看到了相同的代码行。

for(j=0; j<n-1; j++) {
    printf("(%d %d)->(%d) {%1.9lf < %1.9lf }\n", j+1, j, j + n*(j+1), A[j + n*(j+1)], epsilon*norm);
    printf("(%d %d)->(%d) {%1.9lf < %1.9lf }\n", j+1, j, j + n*(j+1), A[j + n*(j+1)], epsilon*norm);
    if(A[j + n*(j+1)] < epsilon*norm) {
        A[j + n*(j+1)] = 0;
    }
}

它出了什么问题?

1 个答案:

答案 0 :(得分:1)

您的宏没有正确地将扩展中的参数括起来:

#define idx(__n__, __i__, __j__) __j__ + __n__*(__i__)

应该是:

#define idx(n, i, j) ((j) + (n) * (i))

除非你真的意味着疯狂。

这是一个错误,但不会导致您的问题。尝试将printf的{​​{1}}格式修改为double而不是%f。另外,请验证%lfjnAepsilon的类型是否与norm格式一致。