2012-08-07 43 views
1

問題。 看到下面的代碼...我錯過了return field;聲明,並沒有發現它的幾個調試運行。我永遠不會認爲像這樣的東西會通過編譯器沒有錯誤!爲什麼呢?Visual Studio - 無法返回值時無編譯錯誤

說明 我有一個使用std::tr1::function有收到建設變換算法的解析器對象。該翻譯從字符串轉換爲類型爲TransportableMessage的對象,該對象由TMFields組成,該對象可以具有不同的類型。所以無論如何,我創建了一個用於創建字段的工廠函數,因爲字段的類型基於一個字符串(來自XML),儘管現在只有少數幾個,但未來可能會有更多。

tstring對象是基於UNICODE的類型轉換,基本上在一分鐘內解析爲std::wstring。也因爲我使用VS2008 unique_ptr不存在,所以我已隱藏std::auto_ptr後面ScopedPtr_t使升級更容易,因此更容易發生。

namespace arc 
{ 
    namespace util 
    { 

     int internalTest() 
     { 
      std::cout << "Any error?" << std::endl; 
     } 

     ScopedPtr_T<TMField> TmFieldFactory(const tstring& name, const tstring& typeName, const tstring& value) 
     { 
      ScopedPtr_T<TMField> field; 
      int a = internalTest(); 
      if(typeName == _T("int") || typeName == _T("long")) 
      { 
       field.reset(new TMNumericField(name, boost::lexical_cast<__int64>(value))); 
      } 
      else if(typeName == _T("string")) 
      { 
       field.reset(new TMStringField(name, value)); 
      } 
      else if(typeName == _T("timestamp")) 
      { 
       field.reset(new TMTimeField(name, boost::lexical_cast<__int64>(value))); 
      } 
      else 
      { 
       std::string info(__FILE__ " :: " __FUNCTION__ " : Unrecognized TmField type "); 
       std::string type(typeName.begin(), typeName.end()); 
       info += type; 
       throw ARC_Exception(info.c_str()); 
      } 
      return field; // I WAS MISSING THIS! 
     } 
    } 
} 

基本上我想知道是否有其他人有這個問題嗎?我介紹了函數internalTest以查看問題是否特定於scoped_ptr s,但看起來不是這樣。我也嘗試在GCC中使用internalTest,它返回一個錯誤。 爲什麼Visual Studio沒有標記這個?我是否在某處可以打開編譯設置?標準是否允許這樣做?道歉,如果這是衆所周知的,我沒有谷歌,並在這裏尋找答案。

編輯::調用代碼 - 只需添加更多的上下文。

SharedPtr_T<TransportableMessage> strToTmConvFunc_Default_Apc7_0(const std::string& tm_str) 
{ 
    pugi::xml_document xmlDoc; 
    if(false == xmlDoc.load(tm_str.c_str())) 
    { 
     ARC_LOG(LOG_WARN, "The passed TM object was malformed. %s", tm_str.c_str()); 
     throw ARC_Exception("Malformed Transportable Message XML"); 
    } 

    pugi::xml_node tmBase = xmlDoc.first_child(); 
    std::string xmlRootName(tmBase.name()); 
    if(xmlRootName.compare("TM") != 0) 
    { 
     ARC_LOG(LOG_WARN, "The passed TM object was malformed. %s", tm_str.c_str()); 
     throw ARC_Exception("Malformed Transportable Message XML"); 
    } 

    std::string tmname = tmBase.child("N").child_value(); 
    std::string entity = tmBase.child("E").child_value(); 
    ARC_LOG(LOG_INFO, "TM message received for parsing. TM name is %s", tmname.c_str()); 

    tstring t_tmname(tmname.begin(), tmname.end()); 
    SharedPtr_T<TransportableMessage> tm_obj(new TransportableMessage(t_tmname, 0)); 

    pugi::xml_node fields = tmBase.child("FS"); 
    for(pugi::xml_node field = fields.first_child(); field; field = field.next_sibling("field")) 
    { 
     tm_obj->addField(arc::util::TmFieldFactory(field.child_value("N"), field.child_value("T"), field.child_value("V"))); 
    } 

    return tm_obj; 
} 
+0

也許這是因爲你沒有什麼導致該模板的實例? – 2012-08-07 17:58:43

+2

你有[警告高](http://stackoverflow.com/a/399865/168175)? – Flexo 2012-08-07 17:59:39

+0

@pwny - 很確定我是在實例化模板,但我添加了'internalTest'函數來刪除它。 @Flexo - 我沒有。我把它變成了W4。由於庫代碼,無法使用WX。即使在W4上,也沒有提到缺失的回報。 – Dennis 2012-08-07 18:04:51

回答

5

在不返回某些東西的情況下掉落一個函數的主體不是錯誤,它是未定義的行爲;見6.3.3 return語句[stmt.return]§3:

Flowing off the end of a function is equivalent to a return with no value; this results in undefined behavior in a value-returning function.

相關問題