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

c++ - 具有不同编译器标志的不同翻译单元中的内联函数未定义行为?

在 Visual Studio 中,您可以为各个 cpp 文件设置不同的编译器选项。例如:在“代码生成”下,我们可以在调试模式下启用基本运行时检查。或者我们可以改变浮点模型(精确/严格/快速)。这些只是例子。有很多不同的标志。

一个内联函数可以在程序中定义多次,只要定义相同。我们把这个函数放在一个标题中,并将它包含在几个翻译单元中。现在,如果不同 cpp 文件中的不同编译器选项导致函数的编译代码略有不同,会发生什么情况?那么它们确实不同,我们有未定义的行为?您可以将函数设为静态(或将其放入未命名的命名空间),但更进一步,直接在类中定义的每个成员函数都是隐式内联的。这意味着如果这些 cpp 文件共享相同的编译器标志,我们只能在不同的 cpp 文件中包含类。我无法想象这是真的,因为这基本上很容易出错。

在未定义行为的土地上,我们真的那么快吗?还是编译器会处理这种情况?

0 投票
1 回答
47 浏览

c++ - 为什么使单元静态会产生内部联系

谁能解释为什么在 C++ 中将函数设为静态使其仅在内部链接。这只是来自平面标准还是一些语言技巧?

0 投票
2 回答
323 浏览

c++ - g++ -E生成的翻译单元中以#符号开头的行是什么

我试图检查为一个简单的 hello world 程序生成的翻译单元的样子。因此,我在 test.cpp 中编写了以下代码。

然后,我使用带有 -E 选项的 g++ 编译了上述文件,并将数据输出到临时文件。该文件具有 c++ 代码,其间的行以 # 符号开头。

像下面这样的东西,

  1. 这些线是什么意思?
  2. 是否有任何我应该阅读的文件,或者我是否必须了解任何特定主题的知识才能理解这个文件?
0 投票
2 回答
548 浏览

c - 有没有办法让链接器从库中提取目标文件的一部分进行链接?

我有一个项目,其中包含数千个 C 文件、许多库和数十个要链接的程序,为了加快编译速度,我将 C 文件组合成包含多个 C 文件的翻译单元。这有时被称为单一编译单元、单一翻译单元或统一构建。

我将这些翻译单元中的多个编译到不同的库中,这些库之前是通过单独编译每个 C 文件来创建的。

例如:

旧库.lib:

新库.lib:

翻译单元_1.c:

翻译单元_2.c:

所以这些编译成:translation_unit_1.o 和 translation_unit_2.o。该库是上面显示的新 library.lib。

现在假设我有一个程序,我想链接到 library.lib,它引用 file2.c 中的一个函数。但是它编译的 file1.c 版本不同,它在库中的 file1.c 中重复符号,因此它只需要 library.lib 中的 file2.c 来链接。或者我可能需要从 file1.c 链接代码,但无法链接 file2.c,因为它有一个我不想依赖的依赖项(下面的示例)。

程序:

您知道的任何链接器是否有办法让链接器仅将 file2.c 中的代码从 translation_unit_1.o 目标代码中提取出来,并使用它来链接 main.o 以制作程序?

如果可能的话,另一种方法是将 translation_unit_1.o 拆分为 file1.o、file2.o、file3.o,然后将其提供给链接器。

谢谢你的帮助。

编辑 1

这适用于为使用通过 ARM ADS 1.2 工具链编译的 ELF 的裸机 ARM 平台和使用 Visual Studio 工具链的 Windows 平台编译的单一代码库。然而,关于如何在其他平台和工具链上解决问题的想法是受欢迎的。

这是在 MacOS 上使用 clang 的具体示例。

下面的示例代码在这里:https ://github.com/awmorgan/single_translation_unit_lib_link

图书馆:

file1.c 这个文件是需要链接的

file2.c 此文件不用于链接,并且具有未解决的依赖关系,可能位于另一个库或对象中

主.c:

文件1.c:

文件2.c:

single_translation_unit.c:

这可以产生program1.out:

这无法产生 program2.out:

更改链接顺序也不起作用:

0 投票
1 回答
356 浏览

c - 传递给 gcc 的多个源文件是否被视为单个翻译单元?

我想我已经读过,根据Single Compilation Unitgcc ,同时编译多个文件将实现与将所有源添加到单个源文件中相同的效果,但我再也找不到任何源了。真的吗?

我们目前正在尝试将二进制文件缩小到可能的最小尺寸,并正在应用多种技术来实现这一目标。我们讨论到了关于单个编译单元、链接时间优化和更改构建以在单个编译器调用中编译所有源代码之间的差异的讨论,例如gcc -o binary $CFLAGS $INCLUDES $CDEFS a.c b.c c.c d.c e.c.

0 投票
2 回答
210 浏览

c++ - 在单例模式中,是什么让实例独一无二?

在实践中,单例模式是使用返回一个局部静态变量的简单静态函数创建的。只要实例是静态的,它就会返回在第一次函数调用期间定义的相同变量。

对我来说令人困惑的部分是,如果我在一个头文件中声明带有静态局部变量的普通静态函数,并在调用该函数时将该头包含在两个不同的翻译单元中,则函数局部静态变量将被构造两次 - 每个翻译单元都构造。

原因是静态函数标识符函数链接是内部的,因此每个翻译单元(源文件)都有该函数的两个实例,因此该静态变量有两个本地实例。

我的问题是为什么同样的逻辑不适用于单例模式?当我们声明静态函数时,为什么它没有内部链接,因此为什么不创建局部静态变量的两个实例(根据定义,它是唯一的单例实例)?

我正在谈论的单例主要功能:

0 投票
1 回答
46 浏览

c++ - 翻译单元数与 cpp 文件数

我们有 2 个案例(场景)。在每种情况下,我们都有 2 个文件:main.cppfile.cpp

情况1

  • 主.cpp:

我通过以下方式编译和运行:

案例2

  • 主.cpp:

我通过以下方式编译和运行:

每种情况下我们有多少translation units?是吗 :

  • 第一个
  • 二为二
0 投票
1 回答
97 浏览

c++ - 我可以在不同的 TU 中提供相同的函数定义吗

我正在阅读有关内部和外部链接的信息,我发现默认情况下,函数具有外部链接。

所以我在想是否可以在头文件管理器中声明一个函数并在不同的翻译单元中提供它的多个定义。

到目前为止,我确实在头文件中声明了一个函数

并在两个文件中提供 2 个定义,每个文件都包含在一个匿名命名空间中:

但是我没有看到这如何成为在不同 TU 中使用函数的多个定义的好例子。

有人可以给我看一个简单的例子(甚至使用内联)谢谢

0 投票
1 回答
55 浏览

c++ - 头文件中定义的静态对象和 cpp 文件中定义的静态对象有什么区别?

假设我有一个头文件,并假设复制宏已得到处理:f1.h:

在包含此标头的任何地方,翻译单元都将拥有自己的 obj 副本。那么,如果 a.cpp、b.cpp、ch 包含这个头文件,obj 会被实例化 3 次?

现在,如果我有以下内容:

f2.h:

f2.cpp:

在这种情况下,我的标头被包含在内,但符号仅在 cpp 文件中创建。因此,链接器只能找到在 cpp 文件中创建的单个静态 obj 对象,而每个引用 .h 文件的翻译单元都会获得该符号?

这是对正在发生的事情的正确直觉还是这里有更多的作用?

0 投票
1 回答
368 浏览

c++ - c++17 inline + thread_local vs thread_local

我想知道如果两者都写在一个头文件中,以下两个声明之间到底有什么区别:

正如 C++17 中所指定的,向变量添加内联会强制所有翻译单元看到该变量的相同地址。这是否意味着可以obj2在不同的翻译单元中获得不同的地址值?什么情况下要强调我们应该使用obj1而不是obj2