C++ 成功编译,不包含<string>标题

C++ Successful compilation without inclusion of <string> header

本文关键字:lt gt 标题 string 包含 成功 编译 C++      更新时间:2023-10-16

我注意到我成功地编译了以下代码,但没有包含<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]#

这不是应该给我一个错误吗?

它取决于实现。一些编译器实现本质上是带有<iostream头的#include <string>,另一些则具有前向声明。

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

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

然而,您似乎没有这样做,因为在您的情况下,在您的实现中,iostream标头似乎(直接或间接)为您包含字符串。然而,你不能依赖这一点。

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