最近朋友让我用Visual studio帮忙运行一下复数求模的程序 代码非常简单如下:
tx.h的头文件
#include"stdio.h"
#include"stdlib.h"
#include"math.h"
double cabs(struct complex z) /*复数的模子程序*/
{
z.x = fabs(z.x);
z.y = fabs(z.y);
if (z.x == 0)
return(z.x);
else
{
if (z.x > z.y)
return(z.x * sqrt(1 + (z.y / z.x) * (z.y / z.x)));
else
return(z.y * sqrt(1 + (z.x / z.y) * (z.x / z.y)));
}
}
tx.c的主程序
#include <stdio.h>
#include <math.h>
#include "tx.h"
double cabs(struct complex z);
void main()
{
struct complex z = { 3,4 };
printf("%.10e\n", cabs(z));
}
于是我想都没想,就去vs中新建了一个C++项目,并且把代码复制了进去。事先朋友跟我说是能跑的就想看看结果。可我一跑傻眼了。代码明明是有错误的:
很明显,在代码中我们并没有定义complex类。那么当下看来肯定是有问题的。可朋友很坚持是可运行的。
没办法,我们只能来寻找其中的错误原因。问题肯定是出在这个complex的复数结构体上。为什么明明没有定义朋友那边却能运行呢?他发了另外一个人的项目给我,奇怪的是真的可以在我的vs中运行。明明代码都是一样的为什么我的就不行呢?
仔细对比,我发现问题所在:
我们ctrl单击complex发现跳转到了corecrt_math.h的头文件中,在头文件中我发现了一系列宏定义
#ifndef _COMPLEX_DEFINED
#define _COMPLEX_DEFINED
struct _complex
{
double x, y; // real and imaginary parts
};
#if defined(_CRT_INTERNAL_NONSTDC_NAMES) && _CRT_INTERNAL_NONSTDC_NAMES && !defined __cplusplus
// Non-ANSI name for compatibility
#define complex _complex
#endif
#endif
可以看到在头文件中定义了一个_complex的结构体:x表示实部,y表示虚部。接着我们又看到在下面
#define complex _complex
说明在这里我们进行了一个宏定义的替换。在前面我们看到一行判断条件.defined()函数用于检测后面的变量是否宏定义。
看到最后的!defined __cplusplus。突然我意识到会不会是我的项目是cpp文件而他的是c文件,导致了这个宏定义的失败。
查询资料发现:确实是这样的。__cplusplus是c++中所定义的宏变量,而在c语言是没有的定义的。所以在我们把主函数文件写成cpp。由于__cplusplus有定义 ,defined __cplusplus为1 !defined __cplusplus为0.因此当我们用C++去调用的时候,这里是会出错的。
原因我想大概因为C++比C多了重载的原因吧
今天的文章关于C++调用math.h头文件中的complex所踩的坑分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/26695.html