jjzjj

c++ - constexpr 和 ODR

如果我们有一个包含以下内容的头文件widget.hpp:constexprintfoo=10;structwidget{intbars[foo];};...我们有两个翻译单元从两个源文件生成,它们都只包含widget.hpp,这是否违反了一个定义规则(更具体地说,是否使用foo违反了一个定义规则)?foo具有内部链接,但它也是一个常量表达式。根据我对C++11标准中3.2.6的阅读(我将在下面引用),如果要求#2不仅仅指静态数据成员,那么这是格式良好的。3.2.6要求#2:ineachdefinitionofD,correspondingnames,lookedupaccordingt

c++ - 在 header 中使用未命名的 namespace 会如何导致 ODR 违规?

在GoogleC++风格指南中,Namespaces部分指出“在头文件中使用未命名的命名空间很容易导致违反C++统一定义规则(ODR)。”我明白为什么不在实现文件中使用未命名的命名空间会导致ODR违规,但不知道在header中使用如何做到这一点。这怎么会导致违规? 最佳答案 原因是如果你真的在匿名中使用任何东西命名空间,你冒着未定义行为的风险。例如:namespace{doubleconstpi=3.14159;}inlinedoubletwoPiR(doubler){return2.0*pi*r;}内联函数(以及类、模板和任何其他

c++ - "potentially-evaluated"是否与 C++03 中的 "odr-used"相同?

举个例子:#includeclassA{public:staticconstintnumberOfWheels=4;};//constintA::numberOfWheels;intmain(){std::cout自A::numberOfWheels以来,它是否正式未定义的行为(UB)在没有定义的情况下被使用?(另请参见here)。正如C++03所述:Themembershallstillbedefinedinanamespacescopeifitisusedintheprogramandthenamespacescopedefinitionshallnotcontainaniniti

c++ - 不使用 odr 的数组计数?

有几个很好的理由去选择#includetemplateconstexprstd::size_tARRAY_COUNT_FUNC(T(&arr)[N]){returnN;}而不是#defineARRAY_COUNT_MACRO(arr)(sizeof(arr)/sizeof(*arr))一个重要的区别是,当一个指针(不是数组)被传递给ARRAY_COUNT_MACRO时,它会默默地返回一个无用的答案,但是将相同的参数传递给ARRAY_COUNT_FUNC会导致编译错误指出错误。但是宏确实有一个优点:它的参数是未计算的。#includestructS{intmember_array[5];

ios - iOS 应用程序中的按需资源 AppStore 上传失败 - 不允许的路径

我有一个使用ARKit的应用程序。直到当前版本,所有Assets都包含在应用程序包本身中,用户使用该应用程序似乎没有问题。但是,我想在应用程序上启用按需资源,以便可以从AppStore下载较新的模块(游戏)的资源,从而避免应用程序过大。按照iOS文档,我能够使用ODR并且该应用程序在我的设备上运行良好。它正在按应有的方式使用ODR加载资源。但是,在上传到AppStore进行AppReview时,我遇到了错误:我的特定SCNAssets文件夹(已标记)的文件夹结构如下:请注意,该应用程序在我的设备上使用ODR时运行良好。我已完成以下操作并尝试了多次,但无济于事。创建一个干净的构建。更改版

ios - 使用 ODR 进行版本控制? (按需资源)

我发现没有提及Apple如何使用其按需资源(ODR)功能处理版本控制。当我需要用新版本替换上传的资源时会发生什么?我可以简单地替换Apple服务器上的资源吗?如果是这样,这对现有用户有何影响?具有该资源的现有用户的应用程序是否会自动替换它? 最佳答案 如果您使用相同的标签发布2.0版应用,但Assets已更新,iOS将重新下载已更改的Assets。观看视频(约21分钟)https://developer.apple.com/videos/play/wwdc2016/221/ 关于ios-

STM32的CRL CRH ODR BRR BSRR寄存器(逐句解析)

 一端口配置寄存器(GPIOx_CRL和GPIOx_CRH)这两个寄存器都是GPIO口配置寄存器,CRL控制端口的低八位,CRH控制端口的高八位。寄存器的作用是控制GPIO口的工作模式和工作速度。每组GPIO下有16个IO口,一个寄存器共32位,每4个位控制1个IO如图所以才需要两个寄存器完成。比如GPIOA_CRL的复位值是0x44444444,4位为一个单位都是0100,一共八个0100,以寄存器低四位说明一下。首先位1:0为00即:设置 PA0为输入模式,如图位3:2为01即:设置为浮空输入模式,如图所以假如GPIOA_CRL的值是0x44444444,那么PA0~PA7都是设置为输入模

c++ - 关于 ODR 违规和模板变量

我知道模板函数在链接时不会受到多重定义的影响,就像在类中定义的成员函数一样,默认情况下是内联的。此外,constexpr对象具有内部链接,但模板变量具有外部链接(我的意思是在命名空间范围和C++14两种情况下)。怎么样?templateconstexprTi_am_odr_safe{};i_am_odr_safe在C++14中有外部链接还是内部链接?对于像函数模板这样的多重定义是否安全?换句话说,i_am_odr_safe是odr安全的吗? 最佳答案 这是coreissue1713,IIRC的方向是这个变量模板会有外部链接。不,这还

c++ - 指向函数和 ODR 的指针

关于ODR的问题太多,但我找不到我要找的东西,如果重复或标题不合适,我们深表歉意。考虑以下几点:structt{t(*id)();};templatettype(){return{type};}这是对我尝试定义uniqueidentifierpertype的过度简化。,希望在不同的编译单元中保持唯一。特别是给定一个具体类型T喜欢std::string,并假设两个不同的编译单元在头文件中包含上述代码,我想表达type().id在两个单元中采用相同的值(类型为t(*)()),因此用作类型T的唯一标识符.值为函数地址type,所以问题是是否有一个独特的功能type在程序中由one-defin

c++ - std::make_unique、匿名命名空间和 ODR

请考虑以下测试用例(从LLVM源减少)://%catfoo1.cpp#includenamespace{classA{inti;};}classG{std::unique_ptrfoo()const;};std::unique_ptrG::foo()const{returnstd::make_unique();}和//%catfoo2.cpp#includenamespace{classA{boola;};}classH{std::unique_ptrbar()const;};std::unique_ptrH::bar()const{returnstd::make_unique();}