我注意到我设法编译了以下代码而没有包含<string>
。不应该给我一个错误吗?
#include <iostream>
using namespace std;
struct Sales_data {
string book_no;
double units_sold;
double price;
};
int main() {
Sales_data book1, book2;
cout << "Please enter first transaction in format: ISBN, units sold & price" << endl;
cin >> book1.book_no >> book1.units_sold >> book1.price;
cout << "Please enter second transaction in format: ISBN, units sold & price" << endl;
cin >> book2.book_no >> book2.units_sold >> book2.price;
cout << "******************************" << endl;
cout << "Total units sold = " << book1.units_sold + book2.units_sold << endl;
cout << "Total revenue = " << (book1.units_sold * book1.price) + (book2.units_sold * book2.price) << endl;
return 0;
}
编译结果:
[yapkm01][~/C++Primer/chapter2]# g++ -std=c++11 -o 2-41a 2-41a.cc
[yapkm01][~/C++Primer/chapter2]#
答案 0 :(得分:6)
不应该给我一个错误吗?
它依赖于实现。一些编译器实现本质上#include <string>
带有<iostream
标头,其他编译器具有前向声明。
始终包含您使用的任何标准类型的标头。多个#include
语句没有任何危害,并且将使用适当的标头保护进行优化。
答案 1 :(得分:4)
你应 #include <string>
,否则您无法保证std::string
的原型可用。
然而,你似乎已经没有这样做了,因为,在你的情况下,在你的实现中,iostream
标题似乎包含了你的字符串(直接或间接)。但是,你不能依赖于此。
始终包含您使用的内容。不这样做依赖于实现定义的行为,并且不可移植。