g ++与MSVC中C ++引号的含义

时间:2011-10-28 12:00:32

标签: c++ visual-c++ g++

可能有谷歌搜索会回答这个问题,但对于我的生活,我想不出一个没有得到数百万无关答案的答案。

所以,

在MSVC文本里面引用“像这样”,我认为,作为std :: string或者std :: string&amp ;.在g ++ / gcc中,它似乎总是被视为const char *。真?

我找到了一个我想玩的代码片段,它包含

if(NULL == key)
   throw exception("Empty key");

在MSVC / VC ++中编译得很好(2008年(但是当我在g ++(4.4.3)上尝试时,我得到了

no matching functions for calls to std::exception::exception(const char&) 

我让这个工作:

if (NULL == key)
{
   std::string   estr   ("Empty key");
   throw exception("Empty key");
}

但那简直太丑了。

这给我带来了不同的错误:

std::string   estr   ("");
if (NULL == key)
{
   estr = "Empty key";
   throw exception("Empty key");
}

我不知道exception()期望什么作为其输入。我找到了一些建议std :: string或者std :: string&但是我丢失了那个页面,而且我发现的数以百万计的无用页面都是无用的。有关异常类,异常使用的各种信息,....

没有我的丑陋修复,是否有一种简单的方法告诉g ++“这是一个std :: string”而不是一个const char&并且仍然保持VC ++的快乐? (显然我正试图从单一来源做交叉编译代码。)

就此而言,如何id

   throw exception("Empty key");

不同
   throw "Empty key";

谢谢,

韦斯

4 个答案:

答案 0 :(得分:3)

字符串文字总是具有char数组的类型,其大小足以包含文字中带有空终止符的字符。因此"Empty key"的类型为char[10]。如果需要,可以将其隐式转换为char const *std::string

错误是因为exception旨在作为异常类型的基类,而不是直接实例化的基类。您应该抛出<stdexcept>中定义的一种类型,例如std::runtime_error(可以使用字符串构造),或者定义继承std::exception并覆盖what()的自己的类型

我猜微软已经为std::exception添加了一个非标准的构造函数。他们喜欢以奇怪的方式扩展语言。

答案 1 :(得分:2)

std :: exception是基类。

尝试改为抛出std :: runtime_error。

答案 2 :(得分:2)

避免按类型std::string抛出异常,因为它们本身可以抛出异常。如果发生这种情况,最终会出现未定义的行为

抛出<stdexcept>中定义的标准异常或让您自己的异常类派生自std::exception类并抛出它。并覆盖what()方法以添加异常的适当描述。

此外,始终throw按值,catch按参考。

答案 3 :(得分:0)

根据标准,

"like this"始终被视为const char的数组。这不是问题所在。真正发生的是std::exception只有默认构造函数,再次根据标准。通常包含一个带有文本字符串的附加构造函数,但是这个构造函数在VC ++和g ++中的工作方式不同,如您的示例所示。

我这里没有g ++文档,但是从你的例子看,它看起来像是将非标准构造函数定义为:

explicit exception(const std::string&);

而VC ++将非标准构造函数定义为:

explicit exception(const char*);