通用VC ++与g ++查询

时间:2009-12-08 08:54:36

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

我无法理解编译器。 以下代码在g ++下的UNIX中可以正常工作,但在VC ++下它甚至不能编译。任何人都可以提供有效理由吗?

#include <stdio.h>
#include <iostream>
#include <string.h>


using namespace std;

int main()
{
    string tmp_nw_msg, crc_chksum, buffer;

    cout << "Enter the string : ";
    cin >> buffer;

    if (strlen(buffer.c_str()) >15 ) {
        tmp_nw_msg = buffer.substr(1,12);
        crc_chksum = buffer.substr(13,2);

        cout << " N/W msg : "<< tmp_nw_msg << endl;
        cout << " crc chksum : "<< crc_chksum << endl;
    }
    else {
        cout << "error" << endl;
    }

    std::cin.get();
    return 0;

}

VC ++引发了以下错误,但在g ++中它确实可以正常工作。

  

错误1错误C2679:二进制'&gt;&gt;' :不   运营商发现哪个需要   类型的右手操作数   'std :: string'(或者没有   可接受的转换)c:\ documents   和设置\我的   文件\视觉工作室   2005 \ projects \ dummy_substr \ dummy_substr \ substr.cpp 13
  错误2错误C2679:二进制'&lt;&lt;' :不   运营商发现哪个需要   类型的右手操作数   'std :: string'(或者没有   可接受的转换)c:\ documents   和设置\我的   文件\视觉工作室   2005 \ projects \ dummy_substr \ dummy_substr \ substr.cpp 19
  错误3错误C2679:二进制'&lt;&lt;' :不   运营商发现哪个需要   类型的右手操作数   'std :: string'(或者没有   可接受的转换)c:\ documents   和设置\我的   文件\视觉工作室   2005 \ projects \ dummy_substr \ dummy_substr \ substr.cpp 20
  错误4致命错误C1075:文件结束   在左支撑前发现'{'at   'c:\ documents和   settings \ my documents \ visual   工作室   2005 \项目\ dummy_substr \ dummy_substr \ substr.cpp(9)”   匹配c:\ documents和   settings \ my documents \ visual   工作室   2005 \ projects \ dummy_substr \ dummy_substr \ substr.cpp 29

g ++的输出:

  

输入字符串:BD2d1100mayor47E   N / W msg:D2d1100mayor crc chksum:   47

1 个答案:

答案 0 :(得分:11)

您需要将#include <string.h>替换为#include <string>

C ++标头没有.h扩展名,以区别于具有相同名称的C标头。

此外,您的程序不需要#include <stdio.h>标头 - 如果您需要从C ++程序调用stdio函数,无论如何都应该#include <cstio>


编辑:“如果这确实是问题,那么错误应该在字符串变量的定义上”由PierreBdR评论

在MSVC ++中,#include <iostream>创建了一个包含的级联,在某些时候#include <stdexcept>。然后,当您查看stdexcept标头文件时,您可以看到#include <xstring>std::string的MSVC ++定义和实现确实在这个xstring标题中,这解释了为什么编译器甚至知道类型 - 尽管你没有#include <string>

然后,如果您查看string标头的内容,您可以看到这是定义与std::string兼容的二进制运算符的位置,这解释了为什么错误仅在包含{{的行上弹出1}}陈述。