繁体   English   中英

卡在字符串库的使用上

[英]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标头,因为并非每个编译器都会这样做。 我知道gccclang当前版本都允许它(我不确定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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM