【发布时间】:2019-10-05 00:24:51
【问题描述】:
我想使用<complex.h> 库来加快一些计算,其中可能包括多达 20 个复杂元素和操作 (+ - * /)。但是,我的同事已经声明了一个结构:
struct complex {
double a;
double b;
};
因此来自库的complex宏与上述结构冲突,无法使用。
问题是,由于对当前项目的巨大影响,我无法更改结构的名称。我尝试改用_Complex 宏,并删除#include <complex.h> 标头,它可以工作,但_Imaginary_I、_Complex_I 或I 不起作用。
#include <stdio.h> /* Standard Library of Input and Output */
// #include <complex.h> /* I want to remove this */
int main() {
struct complex
{
double a;
double b;
};
double _Complex z1 = 1.0;// + 3.0 * _Complex_I;
double _Complex z2 = 1.0;// - 4.0 * _Complex_I;
// none of these work
double _Complex z = CMPLX(0.0, -0.0);
double _Complex z3 = 1.0 + 1.0 * _Imaginary_I;
double _Complex z4 = 1.0 + 1.0 * _Complex_I;
double _Complex z5 = 1.0 + 1.0 * I;
printf("Starting values: Z1 = %.2f + %.2fi\n", creal(z1), cimag(z1));
}
我希望有一种方法可以区分来自库的复杂宏和定义的复杂结构。遗憾的是我无法改变结构,所以事情变得出乎意料地复杂了。
我的__STDC_VERSION__ 是201112L,而__VERSION__ 是“4.2.1 Compatible Apple LLVM 10.0.1 (clang-1001.0.46.4)”。
【问题讨论】:
-
_Complex不是宏;它是§6.4.1 Keyword,_Imaginary也是。以_I为后缀的名称不是关键字;它们是由<complex.h>定义的宏。 -
但是,我的同事已经声明了
struct complex而不是跳过箍来回避这个基本问题,FIX真的很难> 误用a standard C identifier的实际问题?因为那是 REAL 问题,不修复它会奖励错误代码的创建 - 并留下一个地雷,在未来引发各种问题。当 New Coder 开始使用该程序并且不知道他必须#undef complex才能掩盖过去的错误决定时会发生什么?
标签: c header-files c99 complex-numbers standard-library