[英]Stuck at the usage of string library
我的头文件是这样的:
//Sales_data.h
#ifndef SALES_DATA_H
#define SALES_DATA_H
//#include<string>
struct Sales_data
{
std::string bookNo; //compiles without error
};
#endif
通常,每当必须在代码中使用字符串变量时,我们都将包含string
标头。 但是,即使我没有在程序中包含string
标头,使用上述标头的程序也不会出现任何错误。
这是您对标准库的特定编译器/实现的功能。 一般而言,要使代码100%可移植,应包括string
标头,因为并非每个编译器都会这样做。 我知道gcc
和clang
当前版本都允许它(我不确定MSVC),但是为了使您的代码符合标准,您应该始终在要使用std::string
地方包含string
标头。 如果您发现自己必须开发一个编译器无法做到的平台,那么上面给出的代码将无法编译,因此您将不得不花费时间和精力进行调试。 那为什么要打扰呢? 输入#include <string>
,继续进行编程,省去了以后修复它的麻烦。
include
语句可有效地将包含文件的内容粘贴到包含文件中。 这将构建一个庞大的文件,该文件将源文件和所有包含的标头结合在一起。 最终,该组合文件将被编译。
让我们向标头添加一个简单的驱动程序以演示其工作原理:
#include <string>
#include "sales_data.h"
int main()
{
}
变
#include <string> // actual contents of string omitted for brevity
#ifndef SALES_DATA_H
#define SALES_DATA_H
//#include<string>
struct Sales_data
{
std::string bookNo; //compiles without error
};
#endif
int main()
{
}
并且可以编译,但是它依赖于外部依赖项: <string>
必须在"sales_data.h"
之前包含。 这意味着一个微小的变化
#include "sales_data.h"
#include <string>
int main()
{
}
鹅煮熟了。 可能更糟
#include <iostream>
#include "sales_data.h"
int main()
{
}
编译就好了,因为<iostream>
在编译器X的标准库实现中包含了<string>
。 也许编译器Y的库没有,并生成一条错误消息,提示缺少std::string
。 更糟糕的是,编译器Z的设计师认为通过前向声明std::string
而不是包含<string>
可以获得可衡量的优化,并且前向声明不足以完全满足"sales_data.h"
。 编译器Z可能会发出一个完全奇怪的错误消息,因为存在std::string
,但是它不完整,不能用于声明bookNo
。
此标头的包含者必须提前知道必须包含<string>
否则将不得不进行烦人的调试才能编译其代码。 这对任何人来说都不是一个公平的期望,尤其是在解决方案如此微不足道的时候。
因此,惯例和最佳实践是确保所有标头在内部都是自洽的。 头文件应该能够独立运行并以最小的驱动程序进行编译。 如果以下不能编译
#include "header_under_test.h"
int main()
{
}
"header_under_test.h"
不完整, 应该在暴露于野外之前完成。 您节省的时间和沮丧可能是您自己的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.