我无法理解编译器。 以下代码在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
答案 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}}陈述。