问题标签 [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 投票
2 回答
3425 浏览

c++ - c ++如何将类声明为文件的本地类

所以,我知道静态函数是文件本地的函数。因此,不能从其他文件访问它们。这也适用于课程吗?我已经阅读了大量关于如何static class不声明该类以包含纯静态成员和方法(这很明显)的争议,但找不到任何提及这是否会声明该类可在本地访问文件范围,因为更合乎逻辑。

如果没有,那么使用匿名命名空间怎么样,我听说它也可以用来声明文件本地函数?

0 投票
3 回答
219 浏览

c++ - 同名结构,不同定义:segmentation fault with -O2

当一起编译的两个 C++ 文件各自包含不同的结构定义(具有相同名称)时,我在 C++ 程序中遇到了分段错误。

根据这个问题,我知道结构定义仅限于翻译单元(文件及其包含)。

但是,在编译时启用 -O1 或更多时会崩溃。以下最小代码重现了段错误。

该代码位于 3 个简短的 C++ 文件和 2 个头文件中:

使用带有 -O0 标志的 GCC 6.3 编译的这段代码在 valgrind 下运行良好且没有错误。但是,使用 -O1 或 O2 运行它会导致以下输出:

当 libc 重新分配时,该push_back()函数失败std::vector<struct Data> bar。(在我的例子中,它的大小最初是 4 个项目,然后在循环中调用 push_back() 时进一步调整向量的大小。)当struct Datatd_collision1.cc 的大小与 td_collision2.cc 中的大小相同时,程序不会崩溃.

因此,这两种结构定义之间似乎存在冲突。事实上,如果我重命名一个结构,这个错误显然会消失。但是,如上所述,我认为这不可能发生。我误解了什么?此外,如果我摆脱了功能collision1(),段错误就会消失(struct Data在collision1中可能因为未使用而被编译器抛弃)

我的理解是,这两个 CC 文件之间存在明确的分隔,如果标题中不存在结构,则不应出现“串扰”。

编辑:添加缺少的 td2.h

0 投票
1 回答
349 浏览

c++ - Class' Struct 在头文件中的函数声明和 cpp 中的定义。lnk2019 在单独的库中使用函数时

以下将构建良好。当我尝试在不同的库中使用函数时,出现链接器错误。

标题:

cpp

在实际代码中,类中定义了许多结构。因此,我尝试将它们全部设为具有公共成员和成员函数的嵌套类。类似的事情:lib builds,lnk2019 在使用单独的 lib 中的函数时。myClass 中的其他函数工作正常。

它是这样使用的:

我正在做的事情显然是错误的吗?单独声明结构函数定义不是标准吗?

0 投票
2 回答
969 浏览

c - C:澄清翻译单位

如果我们有两个 .c 文件和一个 .h 文件:main.c sub.c sub.h,其中

主程序

子c

我们可以用 i) 编译程序

或 ii)

在这种情况下,预处理器是否输出一个或两个翻译单元

我很困惑,因为:main.c包括sub.h,意味着预处理器会输出一个编译单元。另一方面,创建了两个目标文件,main.o并且sub.o在创建可执行文件之前,让我认为“两个源文件因此两个翻译单元”。

我误解了哪一部分?或者我在哪里犯错误?

0 投票
0 回答
391 浏览

c++ - 什么时候可以稍后声明从模板访问的符号

这个例子编译:

对于其他类似情况,我得到

...在这里声明,稍后在翻译单元中

结论:有时可以延迟声明符号,但并非总是如此。进行这项工作的规则是什么?

非工作情况的示例编译器日志:

Angle::Texture::dataSet 的定义如下所示:

它不能单独使用这个函数,因为它也可以正确编译和工作:

输出:

工作示例

0 投票
4 回答
3895 浏览

c++ - 为什么在 2 个不同的 cpp 文件中定义内联全局函数会导致神奇的结果?

假设我有两个 .cpp 文件file1.cppfile2.cpp

main.cpp我已经提前宣布了f1()and f2()

结果(不依赖于构建,调试/发布构建的结果相同):

哇:编译器以某种方式仅从中选择定义file1.cpp并在f2(). 这种行为的确切解释是什么?

请注意,更改inlinestatic是解决此问题的方法。将内联定义放在未命名的命名空间中也可以解决问题,程序会打印:

0 投票
3 回答
3683 浏览

c++ - 在预编译的头文件中实例化模板会减少编译时间吗?

示例:假设我包含在我的预编译头文件中:

由于在我的项目中经常使用向量的一些实例,例如 std::vector、std::vector 等,如果我在预编译的头文件中也像这样实例化它们会减少编译时间:

更进一步,将虚拟函数添加到使用一些函数的预编译头文件是否有意义:

我非常不确定翻译单元和模板是如何真正工作的,所以在我看来,如果我在预编译的头文件中实例化它们,这应该意味着不需要为每个 .cpp 文件实例化它们。

更新

使用 Visual Studio 2017 和一些常用模板类的实例在实际代码库上进行了测试。

  1. 实例化通用模板类:71731 ms
  2. 没有实例化:68544 毫秒

因此,至少在我的情况下,它花费了更多时间。

0 投票
2 回答
465 浏览

c++ - 防止同一宏在多个翻译单元中具有不同的定义

我正在创建一个库,每个使用它的生成二进制文件(.exe、.so、.dll)都需要不同的命令行定义的宏(-D 选项)。我想确保将成为生成二进制文件一部分的每个翻译单元都使用相同的宏定义进行编译。这是为了例如防止意外的 ODR 违规和其他意外行为。

例如,应该防止这种情况:

该库将提供标头 - library.hpp - 将包含在所有使用它的翻译单元中。我的想法是使用该标题作为创建误用检查的地方。

问题是,最好的方法是什么?

最好按照优先顺序在以下期间检测到滥用:

  • 汇编
  • 链接
  • 运行

由于 C/C++ 编译器的工作方式,在编译期间可能无法实现。但也许至少在链接期间?

我想避免使用外部工具/脚本。我知道可以编写一个脚本来遍历所有目标文件并检查是否都使用了相同的值。但也许有一种对构建系统影响较小的方法,只是重用 C++ 链接器或编译器的工作方式。

独立于平台的解决方案是最好的,但是为 gcc/clang 和 msvc 独立完成它的方法也很有用。

宏定义将始终为整数。

0 投票
3 回答
217 浏览

c++ - 头文件中的内部链接变量 - 每次包含头文件时是否在内存中分配变量?

假设我有一个头文件Resources.h,其中定义了这 5 个结构:

使用const(static默认情况下 in C++, 所以internal linkage) 它们“驻留在”翻译单元的范围内。

现在,假设我将这些文件 10 次包含到我的应用程序中(来自 10 个不同的.cpp)。当我编译时,会创建一个目标文件,并且(稍后)链接器会将所有这些目标文件收集在一起,形成一个唯一的机器可运行代码。

这是否意味着当我run编写程序时,它会在内存中分配 10 次以上的每个结构?即 10x5 结构?

因此,即使稍后将它们链接在一起,它们对于翻译单元也是分开的?或者链接器足够聪明,可以将它们收敛到内存中的唯一分配?

不确定我是否正确完成了这些步骤。我对 C++ 很感兴趣。

0 投票
1 回答
356 浏览

c++ - 模板实现文件中的匿名命名空间

在 .cpp 文件中,匿名命名空间基本上具有文件范围的链接(在#includes 之后),因为 .cpp 文件永远不会被另一个文件包含。但是,头文件中的相同模式将该匿名名称空间传播到包含它的任何位置。有没有办法在头文件中创建类似的效果?我问是因为模板实现必须在标题中。

常规 .h 文件中的一个简单示例如下:

或类似地在某些模板实现文件中。该类型type将在包含此文件的任何位置的范围内。

有没有解决的办法?

编辑:我想我找到了一个冗长但可行的答案。