在 GCC 中,函数模板的节属性被默默忽略

2023-11-24

我试图将一组特定的函数放入一个单独的部分,但在使用 GCC 时遇到了麻烦。

namespace /* anonymous */ {
  [[gnu::section(".mysection")]]
  void regular_func() { }

  template <class T>
  [[gnu::section(".mysection")]]
  void template_func() { }
} // namespace /* anonymous */

void (*ptr1)() = &regular_func;
void (*ptr2)() = &template_func<int>;

随着 clang 的出现,这两个符号regular_func and template_func<int>被放置在.mysection正如我所料。

$ clang++ -std=c++14 a.cpp -c && objdump -t a.o | grep -E "regular|template"
0000000000000000 l     F .mysection 0000000000000006 _ZN12_GLOBAL__N_112regular_funcEv
0000000000000010 l     F .mysection 0000000000000006 _ZN12_GLOBAL__N_113template_funcIiEEvv

但是对于GCC,函数模板不放在.mysection,但在.text.*部分。

$ g++ -std=c++14 a.cpp -c && objdump -t a.o | grep -E "regular|template"
0000000000000000 l     F .mysection 0000000000000007 _ZN12_GLOBAL__N_112regular_funcEv
0000000000000000 l     F .text  0000000000000007 _ZN12_GLOBAL__N_113template_funcIiEEvv

我正在使用 clang-3.7.1 和 gcc-5.3.0。

如何强制 gcc 将模板实例化函数放在单独的部分中?


这可能是一个小小的安慰,但如果您应用 GCC,GCC 将有义务section归因于显式实例化template <class T> void template_func(), 对于每个T您想要实例化的,例如

namespace /* anonymous */ {
    [[gnu::section(".mysection")]]
    void regular_func() { }

    template <class T>
    void template_func() { }

    template [[gnu::section(".mysection")]] void template_func<int>();

} // namespace /* anonymous */


void (*ptr1)() = &regular_func;
void (*ptr2)() = &template_func<int>;

Then:

$ g++ -std=c++14 a.cpp -c && objdump -C -t a.o | grep -E "regular|template"
0000000000000000 l     F .mysection 0000000000000007 (anonymous namespace)::regular_func()
0000000000000007 l     F .mysection 0000000000000007 void (anonymous namespace)::template_func<int>()

很遗憾clang拒绝:

template [[gnu::section(".mysection")]] void template_func<int>();

saying:

template [[gnu::section(".mysection")]] void template_func<int>();
         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
error: an attribute list cannot appear here

所以每个编译器必须有自己的方式,通过条件编译。

此外,此修复带来了额外的麻烦,您必须以某种方式确保 那template_func()无法实例化任何T你没有明确表示 实例化。

您可以通过在函数模板的主体中静态断言来实现这一点T是其中一种类型A,B,C...您允许实例化的。那么如果它 曾经被实例化过T = D, the static_assert会开火;你可以 添加D到列表中并添加显式实例化D:

#include <type_traits>

template<typename T, typename First>
constexpr bool is_in()
{
    return std::is_same<T,First>::value;
}

template<typename T, typename First, typename Second, typename ...Rest>
constexpr bool is_in()
{
    return is_in<T,First>() || is_in<T,Second,Rest...>();
}

namespace /* anonymous */ {
    [[gnu::section(".mysection")]]
    void regular_func() { }

    template <class T>
    void template_func() 
    {
        static_assert(is_in<T,int,float>(),"");
    }

    template [[gnu::section(".mysection")]] void template_func<int>();
    template [[gnu::section(".mysection")]] void template_func<float>();

} // namespace /* anonymous */


void (*ptr1)() = &regular_func;
void (*ptr2)() = &template_func<int>;
void (*ptr3)() = &template_func<float>;
void (*ptr4)() = &template_func<char>; // <-- static_assert fails
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 GCC 中,函数模板的节属性被默默忽略 的相关文章

  • 用 C++ 进行服装建模 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在编写一些软件 最终会绘制一个人体框架 可以配置各种参数 并且计划是在假人身上放置某种衣服 我研究
  • 在 C# 中创建具有单独列的分隔文本

    我一直在尝试在 C 中创建一个制表符限制的文本文件 以便数据正确显示在单独的列中 Firstname Lastname Age John Smith 17 James Sawyer 31 我尝试过 t 字符 但我得到的只是 Firstnam
  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 将内置类型转换为向量

    我的 TcpClient 类接受vector
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • C# Dns.GetHostEntry 不返回连接到 WiFi 的移动设备的名称

    我有一个 C 中的 Windows 窗体应用程序 我试图获取列表中所有客户端的主机名 下面给出的是 ra00l 来自此链接的代码示例 GetHostEntry 非常慢 https stackoverflow com questions 99
  • 使用 C 语言使用 strftime() 获取缩写时区

    我看过this https stackoverflow com questions 34408909 how to get abbreviated timezone and this https stackoverflow com ques
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • PlaySound 可在 Visual Studio 中运行,但不能在独立 exe 中运行

    我正在尝试使用 Visual Studio 在 C 中播放 wav 文件 我将文件 my wav 放入项目目录中并使用代码 PlaySound TEXT my wav NULL SND FILENAME SND SYNC 我按下播放按钮 或
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 私有模板函数

    我有一堂课 C h class C private template
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • 如何在 C# 中调整图像大小同时保持高质量?

    我从这里找到了一篇关于图像处理的文章 http www switchonthecode com tutorials csharp tutorial image editing saving cropping and resizing htt
  • 如何在按钮单击时模拟按键 - Unity

    我对 Unity 中的脚本编写非常陌生 我正在尝试创建一个按钮 一旦单击它就需要模拟按下 F 键 要拾取一个项目 这是我当前的代码 在编写此代码之前我浏览了所有统一论坛 但找不到任何有效的东西 Code using System Colle
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个
  • 当另一个线程可能设置共享布尔标志(最多一次)时,是否可以读取共享布尔标志而不锁定它?

    我希望我的线程能够更优雅地关闭 因此我尝试实现一个简单的信号机制 我不认为我想要一个完全事件驱动的线程 所以我有一个工作人员有一种方法可以使用关键部分优雅地停止它Monitor 相当于C lock我相信 绘图线程 h class Drawi
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了

随机推荐

  • Hadoop“无法为您的平台加载本机 hadoop 库”警告

    我目前正在运行的服务器上配置hadoopCentOs 当我跑步时start dfs sh or stop dfs sh 我收到以下错误 警告 util NativeCodeLoader 无法加载本机 hadoop 库 您的平台 在适用的情况
  • 片段内的图像 GridView

    我在iOS上开发之后 刚刚开始在android平台上开发 我环顾四周 似乎无法弄清楚 我试图在选择操作栏中的选项卡后显示网格视图 该片段通过控制选项卡栏的主要活动进入视图 我认为问题可能与传递上下文有关 但我不确定 这是我的MainActi
  • 将我的应用程序生成的所有声音记录在音频文件中(不是来自麦克风)

    我有一个像仪器一样的屏幕 有播放声音文件的按钮 我想将用户按下按钮时播放的声音录制到单个音频文件中 以便我可以将该文件保存为 mp4 或其他音频格式 您能指导我如何以简单的方式实现这一目标吗 我可以使用麦克风进行录音AVAudioRecor
  • IFRAME 和 iPad 上的 Safari,用户如何滚动内容?

    根据 Apple iOS 的口头禅 应该可以通过用两根手指拖动来滚动 IFRAME 的内容 不幸的是 在 iPad 上运行最新版本的 iOS 时 我还没有找到一个带有使用这种方法滚动的 IFRAME 的网站 也没有出现滚动条 有谁知道用户应
  • Python 子进程安全

    我理解为什么如果您有不受信任的输入 使用 shell True 可能会带来安全风险 但是 我不明白 shell False 如何避免同样的风险 大概如果我想允许用户提供输入 他可能会输入 var rm rf 我的代码可能只是 subproc
  • 如何使用python和beautifulsoup解析html表并写入csv

    我尝试解析 html 页面并获取货币值并写入 csv 我有以下代码 usr bin env python import urllib2 from BeautifulSoup import BeautifulSoup contenturl h
  • Java - 如何在鼠标按钮释放后接收点坐标(JFreeChart)

    我使用 JFreeChart 编写了一个简单的抛物线图 当按下鼠标按钮时 我得到图形点坐标 当释放鼠标按钮时 我也想得到图形点坐标 但图表鼠标移动按下鼠标按钮时不起作用 如何解决我的问题并在释放鼠标按钮后获取图形坐标 这是我的代码 pack
  • 将脚本输出重定向到 docker 日志

    我有一个在节点 docker 容器中运行的 node js 脚本 该脚本当前将其输出转储到容器和 STDOUT 内的日志文件中 许多官方的 docker 镜像都允许你运行docker logs container查看该容器中正在运行的任何内
  • 从查找 URI 获取电话号码

    我一直在尝试使用联系人的查找 URI 获取联系人的电话号码 但没有成功 Cursor myC getContentResolver query lookupURI null null null null String phoneNumber
  • 循环遍历表单的所有控件,甚至是 GroupBox 中的控件

    我想向我的所有文本框添加一个事件Form foreach Control C in this Controls if C GetType typeof System Windows Forms TextBox C TextChanged n
  • 二次贝塞尔曲线:计算点

    我想计算二次曲线上的点 与 HTML5 的 canvas 元素一起使用 当我使用quadraticCurveTo JavaScript 中的函数 我有一个源点 一个目标点和一个控制点 假设我如何计算创建的二次曲线上的点t 0 5 只 知道这
  • 将 Android Studio 升级到 2.0 后,Android 模拟器无法在 Ubuntu 上运行 - 未找到 Qt 库

    今天 我将 Android Studio 安装升级到了 2 0 版本 我手动更新了它 下载 zip 因为更新机制只是告诉我有新版本 但不提供在 Android Studio 中直接更新的可能性 当我现在尝试启动模拟器时 我收到以下错误消息
  • 重命名 Typescript 文件

    可能是我遗漏了一些东西 或者可能是我太累了 P 在 Visual Studio 2012 的 Typescript 项目中 当我重命名 ts 文件时 它不会重命名与该 ts 文件链接的 js 文件 而是创建一个新文件 Ex 旧情况 file
  • 如何在android中用命令执行dex文件?

    有谁可以分享一下在android中用命令执行dex文件的方法吗 这只是为了理解 假设文件 HelloWorld java 中有以下代码 public class HelloWorld public static void main Stri
  • Java反射,使用GetDeclaredField时忽略大小写

    假设我有一个带有名为 myfield 的字符串字段的类 并使用反射来获取该字段 我发现Object getClass getDeclaredField myfield 区分大小写 它会抛出一个NoSuchFieldException例如 如
  • 如何通过 Xcode 以编程方式在 iOS 中使用自定义字体(例如:Helvetica CY.ttf)

    我正在尝试使用Helvetica CY我的应用程序中的字体 我已经按照苹果文档的建议进行了配置 自定义字体显示在故事板的下拉列表中 但是无法以编程方式使用相同的字体在我的班级文件中 我已记录了该应用程序可用的所有字体系列 但是 Helvet
  • 在 Objective-C 中将 & 转换为 & [重复]

    这个问题在这里已经有答案了 我有一个以下格式的 URL 字符串 http myserver com layouts feed aspx xsl 4 amp web 2F amp page dda3fd10 c776 4d69 8c55 2f
  • 在 Vista Ultimate 64 位上获取 HDD(而非卷)序列号

    我曾经想在不使用 WMI 的情况下获取 HDD 序列号 我找到了 我找到并发布在 StackOverFlow com 上的代码在 32 位 Windows XP 和 Vista 上运行良好 当我尝试在 64 位操作系统 特别是 Vista
  • 谷歌地图按方向缩放

    我正在使用谷歌地图来给出从一个点到另一个点的一些方向 虽然我已将地图的缩放设置为 15 但在响应方向请求后缩放会发生变化 以便可能使方向适合地图 有谁知道如何将变焦保持在 15 并聚焦在第一个点 请参阅文档方向渲染器 preserveVie
  • 在 GCC 中,函数模板的节属性被默默忽略

    我试图将一组特定的函数放入一个单独的部分 但在使用 GCC 时遇到了麻烦 namespace anonymous gnu section mysection void regular func template