问题标签 [translation-unit]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
275 浏览

c++ - 使用返回在另一个翻译单元中定义的占位符类型的函数

我很难理解如何实现N3638auto中描述的类型说明符的 C++14 扩展,以及究竟允许什么。

具体来说,该标准的一项更改说,

如果函数声明的返回类型包含占位符类型,则函数的返回类型是从函数体中的返回语句推导出来的,如果有的话。

当函数体与声明在同一个文件中时,很容易看出这是如何工作的;但考虑头文件使用auto占位符声明方法但未定义它的情况。包含此头文件但不包含定义方法的文件的翻译单元如何编译成功?

例如,给定文件foo.hpp

...和文件foo.cpp

...和文件main.cpp

main.cpp...自行编译是否合法?如果不是,为什么不呢?如果是这样,如何get_x实例化,因为编译器无法知道gen_dataeven 的返回类型是否有一个名为 的成员x,更不用说它的偏移量是多少了?

不过,即使不担心模板实例化,这似乎也是个问题;例如,如果您尝试f.gen_data().x直接访问或将其传递给函数会发生什么?

0 投票
1 回答
96 浏览

c++ - 单独文件c ++中的每个方法

在遇到一些内存分配问题之后。我正在尝试将每个方法都放在一个单独的文件中,这是原始程序:

更新

这就是我所做的:完整程序更新 21.03.2015

但是当我尝试编译它时,我遇到了这些错误:https ://github.com/mohsenuss91/Academic/blob/master/NouvelleApprocheBOOST_MEMORY/errors.txt

0 投票
1 回答
698 浏览

c++ - 不同翻译单元中的模板实例

据我所知,每个模板在每个翻译单元上都有不同的实例,据我了解,翻译单元大致是一个cpp文件。

因此,如果我有一个名为test.hpp以下内​​容的文件:

对于每个翻译单元,test即使每个翻译单元的模板参数T相同,我也应该有一个不同的实例。我决定对其进行测试,因此我创建了以下文件(为简洁起见,省略了包括守卫):

我们可以看到,两者都a.cpp使用b.cpp了模板的int实例,test()但是在不同的翻译单元中,所以执行下面的程序:

我期待一个输出,00但我得到01了。我用来测试此代码的 IDE 是 MSVC2010 V10.0.4 SP1。

那么问题是什么?

  • 我对模板和翻译单元的理解有误吗?或者...
  • 我对这个测试代码做错了什么?
0 投票
2 回答
159 浏览

c - 将代码拆分为文件和 O 标志

当使用可以在 C 中并行执行的代码编写程序时,我们肯定会使用O 标志来优化代码。

在大型项目中,我们通常将代码拆分成几个文件。我没有找到答案的问题是:

由于我们将代码拆分为文件并且O标志没有足够的信息来进一步优化,程序的性能是否会下降?有这种可能吗?

0 投票
2 回答
325 浏览

c++ - 跨不同翻译单元的c ++变量/实例初始化顺序

提前致谢。

我在一些实际项目中看到了这些代码。我只是简化了它们来表达我的问题。基类将this指针放入其构造函数中的 a vector(vec)中。使用这个技巧,我们可以利用动态绑定在外部(在 main func 中)调用派生类的方法。关键是将向量定义放在Bash.h中,声明放在main.cpp中。

我的问题是,输出不是我想要的。为什么 vec 在一个 Translation 单元(base.c,我们可以看到大小为 1)中初始化并使用,然后在其他 Translation 单元(main.c,我们可以看到大小变为 0),又被初始化并清除?我想知道不同翻译单元的初始化顺序。似乎 Derive::dInstance 是第一位的,然后 vec 是第二位的,但是为什么呢?

基数.h

基数.cpp

导出.h

导出.cpp

主文件

输出:

0 投票
1 回答
144 浏览

c++ - 在确保翻译单元之间的可用性时是否不推荐使用静态?

从以下stackoverflow 答案中,用户说:

这意味着该变量对于翻译单元是本地的(简单地说,对于单个源文件),并且不能从其外部访问。这种使用 static 实际上在当前的 C++ 标准中已被弃用 - 相反,您应该使用匿名命名空间:

应该:

我不同意匿名命名空间是首选方法,
但现在真的不推荐使用静态了吗?
标准在哪里说这个?

0 投票
1 回答
3482 浏览

c++ - C++ 中的翻译单元 vs 编译单元 vs 目标文件 vs 可执行文件 vs....

我找不到翻译单元、编译单元、目标文件、可执行文件之间的区别……在很多地方,我看到使用一个而不是另一个。

我知道这些文件是在 C++ 程序编译和链接期间生成的。谁能列出这些过程中将生成的所有文件并指定它们之间的差异?

0 投票
2 回答
196 浏览

c++ - 函数内的静态变量与c ++中的静态类变量

对于某个对象的唯一 ID,我可以通过两种方式创建一个计数器,但我不知道哪个更好,因为它们在代码中完全不同(尽管可能不是字节码,我不知道)。

第一种方法是使用一些使用静态变量的函数:

标题:

cp:

另一种选择:

标题:

cp:

仅供参考,我读过前者不是线程安全的,但我不明白为什么后者也是。如果有的话,我更喜欢简单的功能,因为它更简单、更短。

0 投票
1 回答
1406 浏览

c++ - 为什么 C++ 运算符 new/delete/variants 不应该在头文件中?

有人可以解释这个 C++ 编译错误的性质吗?我正在涉足/学习重载全局运算符 new、delete 及其变体。我阅读了几篇 关于这个主题 文章 ,但我找不到一篇似乎专门解决这个问题的文章。

编码

foo.h

foo.cpp

编译错误

关于这个问题的一些奇怪之处我认为是相关的:

  • 如果我注释掉#include <iostream>foo.cpp编译成功
  • 如果我注释掉 中的函数声明,并且foo.h只保留它们的定义,则编译成功。foo.cpp#include <iostream>

我有一些模糊的怀疑;也许回答者会通过他们的回答来确认:

  • 该错误提到了一个,exception specifier所以我想也许通过覆盖这些运算符中的任何一个,我有义务覆盖他们的兄弟姐妹的整个套件。但是,添加operator delete(void*, const std::nothrow_t&)声明和定义并没有改变编译错误。我也不认为重写这些运算符中的任何一个会迫使编码器实现所有这些运算符是正确的,但我错了吗?
  • 我在 StackOverflow 之外阅读了一篇文章,提到这些运算符只能包含在一个“翻译单元”中,因此不应包含在头文件中。我不明白什么是翻译单元,那篇文章也没有解释它是什么。如果这与这个问题有关,请解释什么是“翻译单元”以及为什么需要从头文件中排除函数声明——这似乎与我之前的所有 C++ 编码经验背道而驰。

感谢您的任何见解。

0 投票
1 回答
32 浏览

c++ - 文件中不包含头文件,但仍可以使用未包含的头文件中的类/函数

这是相关文件中的一些代码,称为 Global.h,它在其他头文件中使用并且似乎编译得很好:

如您所见,我可以使用字符串和 ostream 对象,而无需声明使用命名空间或特定文件。显然这意味着 Global.h 正在从其他地方获取信息,但我很好奇这些信息来自哪里?我一直认为,如果文件本身中的#include 指令包含了其他文件的代码,则头文件只会从其他文件中重新转换代码,所以我不确定这是怎么发生的,并且很想知道发生了什么。