使用宏区别不同的VS和C++标准的版本

__cplusplus用于区别C和C++

C中没有定义这个宏

#include <stdio.h>
int main() 
{
#ifndef __cplusplus
    printf("C program.\n");
#else
    printf("C++ program.\n");
#endif
    return 0;
}

__cplusplus可以使程序在C和C++兼容

#ifdef __cplusplus
extern "C"{
#endif

	void function(int x,int y);	
	
#ifdef __cplusplus#endif
  • 这种类型的头文件可以被#include到C文件中编译,也可以被#include到C++文件中编译;
  • extern "C"可以抑制C++对函数名、变量名等符号进行名称的重整,所以编译出的C和C++目标文件中的变量、函数名称等符号相同(否则不同),链接器可以可靠地对两种类型的目标文件进行链接。
  • 此写法是C和C++混用头文件的经典用法;

__cplusplus在C++中用于获取标准版本号用于区别标准

__cplusplus 这个宏是一个整型值,不同标准值不一样,一般版本越高值越大;
C++03标准中,__cplusplus的值被预定义为199711L;
C++11标准中,__cplusplus的值被预定义为201103L;
C++14标准中,__cplusplus的值被预定义为201402L;

 #include <iostream>
int main() 
{
#ifdef __cplusplus
#if  __cplusplus > 199711L
    std::cout<<"C++新标准 "<<std::endl;
    std::cout << "__cplusplus: "<< __cplusplus << std::endl;
#else
    std::cout << "__cplusplus: "<< __cplusplus << std::endl;
#endif
#endif
    return 0;
}

结果:

C++新标准
__cplusplus: 201402

VS 中 __cplusplus 值一直为199711L的解决方法

VS中使用__cplusplus时得到的值一直是199711L是已知存在的问题,从 VS 2017版本后需要打开开关才能使此值正常使用。
从 VS 2017 提供 /Zc:__cplusplus ,该开关在默认情况下处于关闭状态。
在 Visual Studio 中设置此编译器选项(或右键要设置的cpp单独设置此文件也可)
打开“配置属性” > “C/C++” > “命令行”属性页
将 /Zc:__cplusplus 添加到“其他选项:”窗格
在这里插入图片描述

使用宏区别不同的VS和C++标准的版本( _MSC_VER 、 _MSVC_LANG、__cpp_variadic_templates)

若不想使用开关,可以使用宏区分:
(1)使用 _MSC_VER 预定义宏(编译器的宏,VS版本不一样,值不一样);
(2)使用 _MSVC_LANG 预定义宏(启用 /Zc:__cplusplus时, __cplusplus == _MSVC_LANG);
参考 C++2.0新特性(一)——<特性认知、__cplusplus宏开启、Variadic Templates 、左右值区分>…
(3)使用__cpp_variadic_templates宏(200704L)来判断是否是C++11后的标准,此宏是C++11标准定义,此宏的解释: Feature testing (C++20)(推荐使用)
比如VS2010(c++03)和VS2019(C++14)中同时使用一个文件时,假设头文件.h

#ifdef __cpp_variadic_templates
#if __cpp_variadic_templates >= 200704L
#define HAS_USER 1
#endif
#endif

#ifdef HAS_USER 
   void Print() { std::cout<< "VS2019" <<std::endl;}
#else
   void Print() {std::cout<< "VS2010" <<std::endl;}
#endif 
int main()
{
    Print();
    return 0;
}

参考文献:
Visual Studio 中 __cplusplus 宏一直为“199711L”
/Zc (一致性)
Visual Studio(VS)启用更新的 __cplusplus 宏

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qzy0621

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值