C ++没有包含<string>标头的成功编译

时间:2016-07-17 18:19:30

标签: c++ c++11

我注意到我设法编译了以下代码而没有包含<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]#

2 个答案:

答案 0 :(得分:6)

  

不应该给我一个错误吗?

它依赖于实现。一些编译器实现本质上#include <string>带有<iostream标头,其他编译器具有前向声明。

始终包含您使用的任何标准类型的标头。多个#include语句没有任何危害,并且将使用适当的标头保护进行优化。

答案 1 :(得分:4)

#include <string>,否则您无法保证std::string的原型可用。

然而,你似乎已经没有这样做了,因为,在你的情况下,在你的实现中,iostream标题似乎包含了你的字符串(直接或间接)。但是,你不能依赖于此。

始终包含您使用的内容。不这样做依赖于实现定义的行为,并且不可移植。