关于C++调用math.h头文件中的complex所踩的坑

关于C++调用math.h头文件中的complex所踩的坑最近朋友让我用Visualstudio帮忙运行一下复数求模的程序代码非常简单如下:tx.h的头文件#include”stdio.h”#include”stdlib.h”#include”math.h”doublecabs(structcomplexz)/*复数的模子程序*/{ z.x=fabs(z.x); z.y=fabs(z.y); if(z.x==0) return(z.x); else { if(z.x&…

       最近朋友让我用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++项目,并且把代码复制了进去。事先朋友跟我说是能跑的就想看看结果。可我一跑傻眼了。代码明明是有错误的:

关于C++调用math.h头文件中的complex所踩的坑

关于C++调用math.h头文件中的complex所踩的坑

很明显,在代码中我们并没有定义complex类。那么当下看来肯定是有问题的。可朋友很坚持是可运行的。

没办法,我们只能来寻找其中的错误原因。问题肯定是出在这个complex的复数结构体上。为什么明明没有定义朋友那边却能运行呢?他发了另外一个人的项目给我,奇怪的是真的可以在我的vs中运行。明明代码都是一样的为什么我的就不行呢?

仔细对比,我发现问题所在:

关于C++调用math.h头文件中的complex所踩的坑 

我们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

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注