由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - C和C++的复数
相关主题
Why should i include .cpp instead of .h弱问C++一个问题 一直不解
Help C++ Template function link error .问低级问题
global variable usage question in C++C 里面有办法永久改变一个指针的属性吗?
[菜鸟问问题]请问如果有两个 C++ libraryc++头文件太tmd恶心了
弱问c++里有没有NULL这个keyword?一个C#使用C++.NET类库的问题
请教关于link error (C++)的基本问题pthread and C++
基础问题:在header里面define function一个奇怪的library linking问题(c++, boost.python, shared li (转载)
又一个初级问题: C++中多如牛毛的#define格式[合集] 弱问:C++ 里的Vector在Java里用什么替代比较好?
相关话题的讨论汇总
话题: complex话题: c++话题: dummy话题: double话题: include
进入Programming版参与讨论
1 (共1页)
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了,一开始一团浆糊,后来快刀斩乱麻,柳
: 暗花明,最后思路清晰,程序干净,有点像围棋里面的大龙搏杀,最后全部提掉,其乐
: 无穷,哈哈。

1 (共1页)
进入Programming版参与讨论
相关主题
[合集] 弱问:C++ 里的Vector在Java里用什么替代比较好?弱问c++里有没有NULL这个keyword?
visual C++链接不同的第三方library的问题请教关于link error (C++)的基本问题
C#程序调用Windows C++ DLL的问题基础问题:在header里面define function
有谁知道怎么把matlab和VC联接着一起用? (转载)又一个初级问题: C++中多如牛毛的#define格式
Why should i include .cpp instead of .h弱问C++一个问题 一直不解
Help C++ Template function link error .问低级问题
global variable usage question in C++C 里面有办法永久改变一个指针的属性吗?
[菜鸟问问题]请问如果有两个 C++ libraryc++头文件太tmd恶心了
相关话题的讨论汇总
话题: complex话题: c++话题: dummy话题: double话题: include