繁体   English   中英

没有标题的c ++类

[英]c++ class without header

好的,所以我没有问题,但是有一个问题:使用c ++时,您可以将类转移到另一个文件并包含它而无需创建标头,如下所示:

foo.cpp:

#include <iostream>
using namespace std;

class foo
{
public:
   string str;
   foo(string inStr)
   {
       str = inStr;
   }
   void print()
   {
      cout<<str<<endl;
   }
};

main.cpp:

#include "foo.cpp"
using namespace std;

int main()
{
   foo Foo("That's a string");
   Foo.print();
   return 0;
}

所以问题是:这种方法是否比使用头文件还要糟糕? 它更容易使用,也更干净,但是会更慢,是否会引起更多错误? 我已经搜索该主题很长时间了,但是考虑到这个选项,我还没有在互联网上看到一个主题...

命名文件.cpp.hpp (或.c / .h )没有语义上的区别。

人们会对#include "foo.cpp"感到惊讶,编译器不在乎

您仍然创建了“头文件”,但给了它“ .cpp”扩展名。 文件扩展名是给程序员的,编译器不在乎。

从编译器的角度来看,您的示例与

foo.h:

#include <iostream>
using namespace std;

class foo
{
  //...
};

main.cpp:

#include "foo.h"
using namespace std;

int main()
{
   // ...
}

“头文件”只是您在头文件中包含的文件,即另一个文件的头文件(从技术上讲,头文件不必在文件头,有时也不必,但通常是头文件,因此是文件名)。

您仅创建了一个名为foo.cpp的头文件。

通常,将带有扩展名的头文件命名为源文件不是一个好主意。 某些IDE和其他工具可能会错误地认为您的标头是源文件,因此尝试像编译头文件那样进行编译,否则就浪费了资源。

更不用说它可能引起您的同事的困惑。 源文件可能具有C ++标准只允许定义一次的定义(请参阅一个定义规则odr),因为其他文件中未包含源文件。 如果您将头文件命名为源文件,则有人可能会认为无法在其中具有odr定义。

所以问题是:这种方法是否比使用头文件还要糟糕?

您可以考虑复习“ C ++转换单元”是什么的中心思想。

在您的示例中,预处理器的工作就像将foo.cpp的副本插入到main.cpp的内部副本中一样。 预处理器执行此操作,而不执行编译器。

所以...当编译器是单独的文件时,编译器从不会看到您的代码。 正是这个单一的,串联的“翻译单元”被提交给编译器。 .hh和.cc中没有魔术,只是它们满足了您的同事(或老板)的期望。

现在考虑您的问题……翻译单元既不是您的源文件,也不是您的系统的任何包含文件的文件,但它是预处理器将一堆文本(一件事)组合在一起。 那么它会好还是坏呢?


它更容易,更干净,

有可能。 我在“私人”编码工作中经常采用这种“不同”方法。

当我快速评估一下阶乘使用gmpxx.h(mpz_class)时,确实确实采用了这些快捷方式,并且不需要.hpp文件即可正确创建我的编译单元。 仅供参考-12345的阶乘是超过45,000字节。 读字符也毫无意义。

作为“更正式”的工作(工作,合作等),我总是使用头文件,并进行单独的编译,并建立对应用程序有用的函数库,作为应做事情的一部分。 特别是如果我可能共享此代码或为公司档案做贡献。 我有太多充分的理由来描述为什么我建议您学习这些问题。


但这会更慢,会引起更多错误吗?

我想不是。 我想不是。 有一个编译单元,连接各个部分必须正确,但是我认为这不再困难。


我已经搜索该主题很长时间了,但是考虑到这个选项,我还没有在互联网上看到一个主题...

我不确定我是否看过它。 我已经获得了信息。 通常认为分开的编译和库开发可以节省开发时间。 (时间就是金钱,对吗?)

此外,库和头文件是如何将成功打包给他人使用的方法,以及如何提高团队价值的方法。

如果您曾经构建过一个更大的项目,那么两个主要区别将对您显而易见:

  1. 如果将代码作为库交付给其他人,则必须将所有代码(全部IP)提供给他们,而不是仅提供公开类的头以及已编译的库。

  2. 如果您在任何文件中更改一个字母,则将需要重新编译所有内容 一旦大型项目的编译时间缩短了数分钟,您将失去很多生产力。

否则,它当然可以工作,并且结果是相同的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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