【问题标题】:creal and cimag problems with Clang 3.4Clang 3.4 的 creal 和 cimag 问题
【发布时间】:2013-12-06 18:18:03
【问题描述】:

我正在使用 Clang 3.4 用 Petsc 编译一个库并得到:

error: use of undeclared identifier 'creal'

它遵循以下定义:

petscmath.h:121:38: note: expanded from macro 'PetscRealPartComplex'
#define PetscRealPartComplex(a)      creal(a)

我能找到的唯一相关信息是this,我不知道这是否是特定于编译器的东西,是否缺少某些库,或者我对 Petsc 有一些问题。

我尝试使用 `cimag()',因为它在一个小测试文件中,但我无法使用 clang3.4 和 gcc4.8 编译它。

任何人都知道发生了什么。 Google 没有显示任何类似的主题...

编辑

所以这里是一个简单的例子:

#include <complex.h>
int main ()
{
   double complex z;
   double cc = cimag(z);
}

确实用 Gcc4.8 编译(来自 macports):g++-mp-4.8 main.cc -o main

但是在 c11 模式下它没有g++-mp-4.8 -std=c++11 main.cc -o main:

expected initializer before 'z' double complex z;

clang 在这两种情况下都编译它并产生与上面相同的错误。

【问题讨论】:

    标签: c++ gcc clang c11 petsc


    【解决方案1】:

    参考:http://pubs.opengroup.org/onlinepubs/7999959899/basedefs/complex.h.html

    标题应定义以下宏:

    复杂

        Expands to _Complex.
    

    参考:http://en.cppreference.com/w/c/numeric/complex

    如果宏常量 STDC_NO_COMPLEX(C11) 由 编译器,头文件和这里列出的所有名称都是 未提供。

    请注意,当使用 GCC 指定 -std=c++11 时,我得到了相同的结果,但 不是 -x c -std=c11。 YMMV。

    【讨论】:

    • 我是否正确理解 cimag/creal 仅针对 C 而不是 C++ 定义?因此,代码只能通过例如clang++-mp-3.4 -x c main.cc -o main? 编译为 C
    • @Denis 仅当 STDC_NO_COMPLEX 由编译器定义时。我不认为这是 C vs C++ 的事情。
    猜你喜欢
    • 1970-01-01
    • 2014-04-02
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    相关资源
    最近更新 更多