命名空间范围内的 constexpr 变量,带或不带显式内联定义

2023-12-26

即使读完之后这个关于非显式内联命名空间作用域变量的问题 https://stackoverflow.com/q/46107312/3537677,在标头中定义,我对显式内联名称空间作用域变量是否可以有点偏执,因为据我所知,违反 ODR 的行为是 UB 并且不需要诊断。我的理解是否正确,明确内联指定constexpr (and const非易失性类似)在命名空间范围内定义的变量是内联变量因此,当在不同的翻译单元中使用时,它们的 ODR 用法是否可以? 甚至 cppreference.com 也自相矛盾,有时它说内联变量必须是外部的,才能实现 ODR 使用异常,而在另一个页面上,一般来说只有内部链接内联变量是可以的,只有在有额外要求的情况下才可以使用外部变量。

这些假设基本上正确吗?:

/*! @file some_header.hpp */
#ifndef HEADER_GUARD
#define HEADER_GUARD

constexpr int global_non_expl_inline = 42; //UB
static constexpr int global_non_expl_inline_static = 42; //UB
inline int global_expl_inline = 42; //ok
inline int static global_expl_inline_explicit_static = 42; //? external linkage by default but static explicit but still ok?
inline int extern global_expl_inline_explicit_extern = 42; //UB

namespace foo {
constexpr int global_non_expl_inline = 42; //UB
static constexpr int global_non_expl_inline_static = 42; //UB
inline int global_expl_inline = 42; //ok
inline int static global_expl_inline_explicit_static = 42; //? external linkage by default but static explicit but still ok?
inline int extern global_expl_inline_explicit_extern = 42; //UB
}

namespace {
inline int extern global_expl_inline_explicit_extern_but_unnamed_ns = 42; //ok
}

struct bar{
    static int const in_class_static = 42;//ok
    static int in_class_but_out_of_source_def;
};

int bar::in_class_but_out_of_source_def = 42;//UB

#endif

嗯...既然你实际上让自己对你的问题感到困惑,我想我应该进一步研究它。首先,我们必须对变量的相关属性进行分类:生命周期、可见性、链接 这些受到关键词的影响:static, inline, constexpr, const, extern您在问题中使用的。

在变量定义的命名空间范围内:
- static:指定内部链接
- inline:允许在不同的翻译单元中对同一变量进行多个相同的定义,并确保它们引用相同的对象(例如具有相同的地址)
- constexpr: 暗示const - const:默认为外部链接
- extern:指定外部链接

Thus,
- global_non_expl_inline:默认为外部链接。没问题,除非另一个翻译单元定义了另一个具有外部链接的此类变量。
- global_non_expl_inline_static: 内部链接。很好,只要您不在任何地方定义其他此类变量即可。
- global_expl_inline:外部链接和inline。没问题,除非另一个翻译单元声明了另一个这样的变量而没有inline.
- global_expl_inline_explicit_static: 好吧,一个static inline变量是有意义的,如果您不希望它在链接时可用,但确实希望在所有翻译单元中使用相同的变量 - 例如对各种常量有用。
- global_expl_inline_explicit_extern:外部链接和inline。没问题,除非另一个翻译单元声明了另一个这样的变量而没有inline.
- global_expl_inline_explicit_extern_but_unnamed_ns:内部链接根据参考参数 https://en.cppreference.com/w/cpp/language/storage_duration.

在班级范围内:
- in_class_static: 外部链接。很好,根据参考参数 https://en.cppreference.com/w/cpp/language/static,但如果使用 odr,则需要在命名空间范围内进行声明。
- in_class_but_out_of_source_def: 外部链接。也还好。这实际上是标准方式。

总之,未定义的行为比您想象的要少得多 - 这很好。然而,有一些事情是有效的,但并没有真正意义,比如extern在未命名的命名空间中。

关于您对此问题的评论:我无法重现该问题并且该问题评论部分的其他人也不能。您可以在评论部分找到该问题的其他合理性问题。请记住,stackoverflow 上的一些问题是由那些不完全知道遇到问题时采取哪些步骤的人提出的。我不会太关心这个特定问题;)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

命名空间范围内的 constexpr 变量,带或不带显式内联定义 的相关文章

  • 如何使用 C# 中的参数将用户重定向到 paypal

    如果我有像下面这样的简单表格 我可以用它来将用户重定向到 PayPal 以完成付款
  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • WPF DataGrid 删除所选项目

    最近 我一直在开发一个项目 该项目以编程方式将数据导入到 WPF DataGrid 中 我几乎完成了该项目 但我遗漏的是一个用于删除所选单元格的按钮 这就是我陷入困境的地方 我使用 DataGrid 的基本知识编写了这段代码 var gri
  • 使用 Python 从 URL 中提取 id

    我有一个这样的网址url https www example com contents 6641345 我想提取id在最后的url你可以说interger上面字符串的一部分 我尝试了提供的解决方案https stackoverflow co
  • 如何从通用对话框类中获取数据

    我决定创建一些自定义对话框类 这些类可以由不同情况下的不同活动通用 具体来说 我创建了一个对话框 其中包含一个 EditText 框和一个如下标题 public class EditTextDialogFragment extends Di
  • 通过动态链接和手动设置增强单元测试框架

    我正在尝试设置一个具有动态链接和手动设置的 boost 单元测试框架 不是 BOOST AUTO TEST CASE 我做了一个简单的例子来重现我的错误 SomeLib cpp define BOOST TEST DYN LINK incl
  • 使用 joblib.dump 保存和加载经过训练的 GradientBoostingClassifier

    我正在尝试使用 joblib dump 使用以下代码保存经过训练的 GradientBoostingClassifier use 90 of training data NI int len X tr 0 9 I1 np random ch
  • 如何开始为 ARM 处理器编写自己的移动操作系统?

    我有兴趣创建自己的移动操作系统 我读到现有的移动操作系统在 ARM 处理器上运行并使用其汇编语言 而 Linux 和 Windows 等桌面操作系统是用 asm 编写的 C 似乎是两者共同的语言 这让我想到一些问题 如果我想构建自己的针对
  • 如何使用 Jest 模拟测试 Node.js CLI?

    我一开始就陷入困境 只需要 CLI 并捕获其输出 我尝试了两种方法 但都不起作用 这是我的 cli js usr bin env node console log Testing process exit 0 这是我的 cli test j
  • ms-excel 兼容的 csv 文件,代表 MarkLogic 目录中的所有文档

    我怎样才能最好地制作一个MS Excel兼容的csv代表 MarkLogic 目录中所有文档的文件 使用XCCJava 客户端和Tomcat and Marklogic两者都位于偏远地区 目录中的文档数量约为15000个 第一部分 获取目录
  • 实例构建效率低下?

    这是一个简单的struct pub struct Point x uint y uint impl Point pub fn new gt Point Point x 0u y 0u fn main let p box Point new
  • 当我创建新项目时,Xcode 4 的项目导航器中的“M”和“A”图标是什么意思?

    Xcode 4 在项目导航器中的文件旁边显示灰色的 M 和 A 图标 我相信它们与源代码控制有关 重点是 我在 Xcode 4 中打开和编辑的所有旧 Xcode 3 项目都不显示这些图标 我在 Xcode 4 中创建的新项目也不受源代码控制
  • 相关产品的 Schema.org 设置?

    我想为相关产品设置 Schema org 标记 我已经尝试过这段代码 但我心中有疑问 itemprop isRelatedTo itemscope itemtype http schema org Product 我的产品页面是https
  • ExtJS4 LinkBut​​ton 组件

    我正在尝试在 Ext JS 4 中创建自己的 LinkBut ton 组件 没什么新意 对吧 我的代码如下所示 Ext define LinkButton extend Ext Component xtype linkbutton auto
  • 用于在 AssemblyInfo.cs 中设置自定义属性的 MSBuild 任务

    是否有用于在 AssemblyInfo cs 中设置自定义属性的 MSBuild 任务 我找到了 AssemblyInfo 任务 但它似乎无法设置自定义属性 只能设置预定义属性 我想设置已添加到此文件中的 3 个自定义属性 有什么建议如何解
  • 什么是 adb 守护进程?

    运行应用程序时 会形成 apk 文件 并且该 apk 文件会安装在模拟器中 为了在模拟器中安装 apk 文件 我们需要 Android 调试桥 ADB 服务 守护进程是该服务的一部分 我的问题是守护进程的工作是什么 它有什么作用 From
  • 不明确的表更新查询

    我收到错误消息 表不明确 我正在使用别名 因此不确定为什么表不明确 这是我的代码 UPDATE Field Translations SET SourceColumn1 EnteredProduct SourceValue1 I Produ
  • 在 Windows 资源管理器中打开文件夹结构时,DirectoryInfo.Delete(True) 不会删除

    假设我有一个类似的文件夹结构 C MyTemp MySubFolder 如果我尝试使用以下方法删除它 Dim path As String C MyTemp Dim di As System IO DirectoryInfo di Syst
  • PHP ftp_nb_get 下载时获取本地部分文件大小

    My code conn id ftp connect ip address port login result ftp login conn id username password if conn id login result p g
  • 分配多个相同类型的数组

    我需要分配多个相同类型和形状的数组 一开始 我做了类似的事情 void alloc arrays v1 size t nmemb int a1 a2 a3 a1 malloc nmemb sizeof int a2 malloc nmemb
  • 来自 Go 编程语言的 Android 应用

    我从 google 听到有关 Go 编程语言的嗡嗡声 维基百科是这样描述的 Go 的目标是提供静态类型编译语言的效率以及动态语言的编程便利性 我在想 既然它是来自android制造商的语言 他们应该对创建android应用程序有一些支持 有
  • 命名空间范围内的 constexpr 变量,带或不带显式内联定义

    即使读完之后这个关于非显式内联命名空间作用域变量的问题 https stackoverflow com q 46107312 3537677 在标头中定义 我对显式内联名称空间作用域变量是否可以有点偏执 因为据我所知 违反 ODR 的行为是