相关疑难解决方法(0)

在运行时可以检测到C++ 03和C++ 11之间有什么区别?

可以编写一个函数,当用C编译器编译时它将返回0,并且当用C++编译器编译时,将返回1(微不足道的 #ifdef __cplusplus情况并不令人感兴趣).

例如:

int isCPP()
{
    return sizeof(char) == sizeof 'c';
}
Run Code Online (Sandbox Code Playgroud)

当然,只有在sizeof (char)不相同的情况下才会起作用sizeof (int)

另一个更便携的解决方案是这样的:

int isCPP()
{
    typedef int T;
    {
       struct T 
       {
           int a[2];
       };
       return sizeof(T) == sizeof(struct T);
    }
}
Run Code Online (Sandbox Code Playgroud)

我不确定这些例子是否100%正确,但你明白了.我相信还有其他方法可以编写相同的功能.

在运行时可以检测到C++ 03和C++ 11之间有什么区别?换句话说,是否有可能编写一个类似的函数,它返回一个布尔值,表明它是由符合标准的C++ 03编译器还是C++ 11编译器编译的?

bool isCpp11()
{ 
    //???
} 
Run Code Online (Sandbox Code Playgroud)

c++ language-detection c++11 c++03

116
推荐指数
8
解决办法
7388
查看次数

程序以VS2017上的"abort()调用"错误结束

下面的代码通过给出错误退出

"abort()被称为".

是因为析构函数抛出异常?我知道从析构函数中抛出异常会导致未定义的行为,但也存在反向参数.此外,相同的程序在VS 2012中正常工作.

#include "stdafx.h"
#include<iostream>
using namespace std;
class Txn
{
 public:
     Txn()
     {
        cout<< "in Constructor" << endl;
     };

    ~Txn()
    {
        try
        {
            cout << "in destructor" << endl;
            throw 10;
        }
        catch(int i)
        {
            cout << "in destructor exception" << endl;
            throw;
        }
    }
};

int main()
{
    try
    {
        Txn t;
    }
    catch (int i)
    {
        cout << "Exception" << i << endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

VS2017发行说明没有提及任何有关异常处理更改的内容.

所以我有以下问题:

  1. 从VS2017开始在析构函数中抛出异常是不正确的吗?它会一直通过调用abort()来退出程序吗?
  2. 有没有可以让它起作用的旗帜?

请建议.

c++ c++11 visual-studio-2012 c++14 visual-studio-2017

1
推荐指数
1
解决办法
1090
查看次数