如何判断一段程序由C编译程序还是由C++编译程序编译的

如果编译器在编译cpp文件,那么 _cplusplus就会被定义,如果是一个C文件被编译,那么 _STDC_就会被定义,_STDC_是预定义宏,当它被定义后,编译器将按照ANSIC标准来编译C语言程序。
所以,可以采用下列程序示例判断:

#include<stdio.h>

#ifdef _cplusplus
#define USING_C 0
#else
#define USING_C 1
#endif

#include<stdio.h>
int main()
{
      if(USING_C)
            printf("C\n");
      else 
            printf("C++\n");
      return 0;
}

//在C++编译环境下,程序应输出结果为C++,但不知为何我在visul stdio2010中cpp文件中编译结果为C
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

需要注意的是,如果在C++编译器里使用通过C编译的目标文件,需要通知C++编译器:

#ifdef _cplusplus
extern "C"{
#endif
   //具体的代码
#ifdef _cplusplus
}
#endif
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

那么,在C++程序中调用被C编译器编译后的函数,为什么要加extern “C”呢?
C++语言是一种面向对象编程语言,支持函数重载,而C语言是面向过程的编程语言,不支持函数重载,所以函数被C++编译后在库中的名字与C语言不同。如果声明一个函数float f(int a,char b),C++编译器会将这个名字变成像_f_int_char之类的东西以支持函数重载,而C编译器内部名为_f,这样连接器将无法解释C++对f()的调用。
C++提供了C语言替代连接说明符符号extern”C”来解决名字匹配的问题,extern 关键字告诉编译器其声明的函数和变量可以在模块或其他模块中使用。extern后跟一个字符串来指定想声明的函数的连接类型,后面是函数声明。

extern "C"{
 float f(int a,char b);
 //其他函数
 }

//或者写成
extern "c"{
#include "Myheader.h"
//其他C头文件
}
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

该语句的目的是告诉编译器f()是C连接的,函数f是采用C语言方式链接的,应该在库中找名字_f而不是找_f_int_char,这样C++就不会转换函数名。标准的连接类型指定符有“C”“C++”两种。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值