- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试编写一种简单的方法来在程序开始时自动执行代码(不使用不可移植的属性())。
我编写了以下代码,如果将 main() 之前编写的代码放在头文件中,我会问它是否确实违反了 ODR。
或者,内联函数和变量是否阻止了这种情况?
如果违反 ODR,是否会出现函数被调用两次的情况?
#include <iostream>
//-----
template <void(*init_function)()>
class execute_at_start
{
struct dummy final {};
~execute_at_start() = delete;
inline static dummy execute_() { init_function(); return dummy{}; }
inline static dummy auto_init_ = execute_();
};
//-----
inline void echo(){ std::cout << "echo" << std::endl; }
template class execute_at_start<&echo>;
int main()
{
std::cout << "EXIT SUCCESS" << std::endl;
return EXIT_SUCCESS;
}
最佳答案
您的解决方案应该是 ODR 安全的。 C++标准要求静态数据成员只有一个实例auto_init_
对于 execute_at_start<>
的每个不同的实例化类模板并且它被初始化一次。
Itanium C++ ABI(除了 MSVC 之外,大多数编译器都遵守它)需要全局变量的保护变量(这里是 auto_init_
)以确保它们被初始化一次:
If a function-scope static variable or a static data member with vague linkage (i.e., a static data member of a class template) is dynamically initialized, then there is an associated guard variable which is used to guarantee that construction occurs only once.
std::cout
和 friend 们)。在此解决方案中
counter
是一个具有外部链接的显式保护变量,它确保只有
execute_at_start
的第一次调用构造函数调用
init_function
:
// Header begin.
#include <iostream>
template<void(*init_function)()>
class execute_at_start {
static inline int counter = 0;
public:
execute_at_start() {
if(!counter++)
init_function();
}
};
inline void echo() { std::cout << "echo" << std::endl; }
execute_at_start<echo> const execute_at_start_echo; // A copy in each translation unit.
// Header end.
int main() {}
关于c++ - 在程序启动时自动执行代码而不违反 ODR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62467910/
考虑这个程序: #include template constexpr bool g() { return true; } template std::enable_if_t()> f() {}
我尝试编写一种简单的方法来在程序开始时自动执行代码(不使用不可移植的属性())。 我编写了以下代码,如果将 main() 之前编写的代码放在头文件中,我会问它是否确实违反了 ODR。 或者,内联函数和
如果编译的话,像这样的东西会明显违反 C++ 的单一定义规则: // Case 1 // something.h struct S {}; struct A { static const S v
想象一下我有两个不同的翻译单元 a.cpp #include double bar(); template T foobar(T t) { return t; } int main() {
似乎无法让简单的堆栈实现正常工作。我只是想让两个不同的类(B 类和 C 类)能够在由第三类(A 类)管理的相同堆栈中推送和打印元素。 A.cpp #include "A.h" void A::pop(
我确实理解 ODR 所说的内容,但我不理解它试图实现的目标。 我看到违反它的两个后果——用户会得到语法错误,这完全没问题。并且还可能存在一些 fatal error ,并且用户将再次成为唯一有罪的人。
当今的许多 C++ 代码都倾向于在最大程度上进行模板加载。它们是库:STL、Boost.Spirit、Boost.MPL 等。他们鼓励用户在表单中声明功能对象 struct S { /* presen
链接包含不同版本 boost 的静态 cpp 库和动态 cpp 库是否会违反 ODR? 我正在开发一个 iPhone 应用程序。对于最终的可执行文件,我需要链接一个静态库,比如 libstatic1.
详细解释如下,问题在底部。 我的问题具体指的是当前的 C++ 标准草案(也是当前的“主要”标准)here .更具体地说,关于成员函数和 ODR,第 3.2 节第 6 点(第 35 页)指出 D 的每个
问题是关于 C++ 文档和标准文档的。以下代码中是否使用了变量 x odr? extern int x; template T f() { return x; } 我好像没用过,老兄文档里有写吗? (
在从生产库在线阅读代码时,我发现了类似这样的东西 Traits.hpp template class Traits { template * = nullptr> static vo
来自 here : struct piecewise_construct_t {}; constexpr piecewise_construct_t piecewise_construct = {};
我对 static 有点困惑const 的类内初始化成员。例如,在下面的代码中: #include struct Foo { const static int n = 42; }; // c
这个问题出现在 this answer 的背景下. 如我所料,这个翻译单元无法编译: template int getNum() { return Num; } template int getNu
在同时使用 C 和 C++ 的项目中,.h 文件包含类型的定义。如果该定义取决于 header 是否包含在 c 或 cpp 文件中,我是否违反了单一定义规则? // my_header.h struc
Stack Overflow 上有几个问题,类似于“为什么我不能在 C++ 中初始化静态数据成员”。大多数答案都引用标准告诉你什么你可以做什么;那些试图回答为什么的人通常指向一个链接(现在似乎不可用)
考虑以下说明性示例 #include template struct Base { static int const touch; Base() { (void)t
我正在尝试使用非球面透镜公式将 9 个点的云拟合为圆锥曲线: z(r) = r² /(R*(1+sqrt(1-(1+K)*(r²/R²)))) 其中 R 是曲率半径,K 是圆锥常数,r = sqrt(
我们有一个头文件,其中包含各种浮点精度的一些残差: template struct rsdTarget { static const double value; }; template <> c
这个问题在这里已经有了答案: If I don't odr-use a variable, can I have multiple definitions of it across translat
我是一名优秀的程序员,十分优秀!