c*******h 发帖数: 1096 | 1 C和C++的复数好像不是很兼容。下面这个问题怎么办?
我有一个legacy.h,里面定义了一个dummy函数
#ifndef _LEGACY_
#define _LEGACY_
#include
void dummy(complex x);
#endif
用gcc是可以编译的
然后我写一个驱动器driver.c
#include
#include "legacy.h"
int main(void) {
complex c = 4.0;
dummy(c);
return 0;
}
gcc也是能编译的
然而我把driver.c改成driver.cpp,g++编译就不通过了,说
In file included from driver.cpp:2:0:
legacy.h:4:20: error: ISO C++ forbids declaration of 'x' with no type [-
fpermissive]
driver.cpp: In function 'int main()':
driver.cpp:4:11: error: ISO C++ forbids declaration of 'c' with no type [-
fpermissive]
在保持legacy.h不动的前提下,我应该怎样写driver.cpp才能用上这个dummy函数? |
c*******h 发帖数: 1096 | 2 呃。。我想到了一个办法。。写一个wrapper,把
void dummy(complex x);
包在
void dummy(double complex x);
里面。这个C和C++都认。。。
疯掉了,每一个函数都得写一个wrapper
【在 c*******h 的大作中提到】 : C和C++的复数好像不是很兼容。下面这个问题怎么办? : 我有一个legacy.h,里面定义了一个dummy函数 : #ifndef _LEGACY_ : #define _LEGACY_ : #include : void dummy(complex x); : #endif : 用gcc是可以编译的 : 然后我写一个驱动器driver.c : #include
|
m*******l 发帖数: 12782 | 3 ft, compiler said something you ignored
【在 c*******h 的大作中提到】 : C和C++的复数好像不是很兼容。下面这个问题怎么办? : 我有一个legacy.h,里面定义了一个dummy函数 : #ifndef _LEGACY_ : #define _LEGACY_ : #include : void dummy(complex x); : #endif : 用gcc是可以编译的 : 然后我写一个驱动器driver.c : #include
|
f*******n 发帖数: 12623 | |
c*******h 发帖数: 1096 | 5 试过了,不work
【在 f*******n 的大作中提到】 : try "double _Complex c = 4.0 + 0.0I" : http://stackoverflow.com/questions/10540228/c-complex-numbers-i
|
t****t 发帖数: 6806 | 6 先讲C. C里的complex在C99开始成为标准. 三个浮点类型有相对的三个浮点复数类型, 即
float _Complex, double _Complex, long double _Complex.
complex是一个宏, 展开成_Complex. 但是具体实现允许不定义这个宏, 或者undef它.
所以这个是不安全的.
C99允许写complex a;或者_Complex a;这样的写法.
C++98不兼容C的写法. C++11兼容double _Complex a;这样的写法(#include
>), 但是complex被重新用于std::complex了, 所以没有complex==_Complex这一说.
C++不能使用_Complex a;这样的写法.
最后, 所有的实现在二进制表示上都是兼容的, 都等同于T [2]的结构, 不管是T
complex, T _Complex, 还是std::complex.
所以你可以做的是, 在.c里用double _Complex, 在.cpp里用std::complex.
.h就需要分情况重新定义.
#ifndef __cplusplus
#include
#define CPLX double _Complex
#else
#include
#define CPLX std::complex
#endif
所有的声明都使用CPLX这样的写法. 在.h的最后, 可以#undef CPLX, 以免污染名空间.
连接应该没有问题.
【在 c*******h 的大作中提到】 : 试过了,不work
|
c*******h 发帖数: 1096 | 7 .h能动的话直接将complex查找替换成double complex就行了,不用这么复杂。。
现在就是不想动.h
, 即
.
ccomplex
【在 t****t 的大作中提到】 : 先讲C. C里的complex在C99开始成为标准. 三个浮点类型有相对的三个浮点复数类型, 即 : float _Complex, double _Complex, long double _Complex. : complex是一个宏, 展开成_Complex. 但是具体实现允许不定义这个宏, 或者undef它. : 所以这个是不安全的. : C99允许写complex a;或者_Complex a;这样的写法. : C++98不兼容C的写法. C++11兼容double _Complex a;这样的写法(#include : >), 但是complex被重新用于std::complex了, 所以没有complex==_Complex这一说. : C++不能使用_Complex a;这样的写法. : 最后, 所有的实现在二进制表示上都是兼容的, 都等同于T [2]的结构, 不管是T : complex, T _Complex, 还是std::complex.
|
t****t 发帖数: 6806 | 8 你如果永远不用的话这样也可以. 不过不动.h很难了.
【在 c*******h 的大作中提到】 : .h能动的话直接将complex查找替换成double complex就行了,不用这么复杂。。 : 现在就是不想动.h : : , 即 : . : ccomplex
|
c*******h 发帖数: 1096 | 9 我现在的做法是写了一个wrapper.h
#include "legacy.h"
void dummy_wrapper(double complex x);
和wrapper.c
#include "wrapper.h"
void dummy_wrapper(double complex x) {
dummy(x);
}
旧的legacy.h用gcc编译
wrapper.h和wrapper.c用gcc编译
driver.cpp调用dummy_wrapper,用g++编译
的确不能用。就只能一直用
处理legacy code很头痛
【在 t****t 的大作中提到】 : 你如果永远不用的话这样也可以. 不过不动.h很难了.
|
t****t 发帖数: 6806 | 10 你这不是加了.h吗? 这还不如改.h呢. 更WS的办法是直接声明
extern "C" {
void dummy(std::complex x);
}
这个应该可以直接用.
【在 c*******h 的大作中提到】 : 我现在的做法是写了一个wrapper.h : #include "legacy.h" : void dummy_wrapper(double complex x); : 和wrapper.c : #include "wrapper.h" : void dummy_wrapper(double complex x) { : dummy(x); : } : 旧的legacy.h用gcc编译 : wrapper.h和wrapper.c用gcc编译
|
d****i 发帖数: 4809 | 11 哈哈,偶最喜欢C和C++缠在一起互搞的code了,一开始一团浆糊,后来快刀斩乱麻,柳
暗花明,最后思路清晰,程序干净,有点像围棋里面的大龙搏杀,最后全部提掉,其乐
无穷,哈哈。
【在 c*******h 的大作中提到】 : 我现在的做法是写了一个wrapper.h : #include "legacy.h" : void dummy_wrapper(double complex x); : 和wrapper.c : #include "wrapper.h" : void dummy_wrapper(double complex x) { : dummy(x); : } : 旧的legacy.h用gcc编译 : wrapper.h和wrapper.c用gcc编译
|
m****t 发帖数: 2329 | 12 f t
【在 d****i 的大作中提到】 : 哈哈,偶最喜欢C和C++缠在一起互搞的code了,一开始一团浆糊,后来快刀斩乱麻,柳 : 暗花明,最后思路清晰,程序干净,有点像围棋里面的大龙搏杀,最后全部提掉,其乐 : 无穷,哈哈。
|