__cplusplus
__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 宏