使用 C 预处理获取字符串的整数值

2023-12-26

我将如何创建一个C宏获取字符串的整数值?具体用例来自一个问题here https://stackoverflow.com/questions/9524342/how-to-specify-enum-size-in-gcc。我想像这样更改代码:

enum insn {
    sysenter = (uint64_t)'r' << 56 | (uint64_t)'e' << 48 |
               (uint64_t)'t' << 40 | (uint64_t)'n' << 32 |
               (uint64_t)'e' << 24 | (uint64_t)'s' << 16 |
               (uint64_t)'y' << 8  | (uint64_t)'s',
    mov = (uint64_t)'v' << 16 | (uint64_t)'o' << 8 |
          (uint64_t)'m'
};

To this:

enum insn {
    sysenter = INSN_TO_ENUM("sysenter"),
    mov      = INSN_TO_ENUM("mov")
};

Where INSN_TO_ENUM扩展为相同的代码。性能是一样的,但可读性会提高很多。

我怀疑这种形式可能是不可能的,因为 C 预处理器无法进行字符串处理,所以这也是一个不受欢迎但可以接受的解决方案(变量参数宏):

enum insn {
    sysenter = INSN_TO_ENUM('s','y','s','e','n','t','e','r'),
    mov      = INSN_TO_ENUM('m','o','v')
};

这是一个编译时的纯 C 解决方案,您表示可以接受。您可能需要扩展它以获得更长的助记符。我会继续思考想要的(即INSN_TO_ENUM("sysenter"))。有趣的问题:)

#include <stdio.h>

#define head(h, t...) h
#define tail(h, t...) t

#define A(n, c...) (((long long) (head(c))) << (n)) | B(n + 8, tail(c))
#define B(n, c...) (((long long) (head(c))) << (n)) | C(n + 8, tail(c))
#define C(n, c...) (((long long) (head(c))) << (n)) | D(n + 8, tail(c))
#define D(n, c...) (((long long) (head(c))) << (n)) | E(n + 8, tail(c))
#define E(n, c...) (((long long) (head(c))) << (n)) | F(n + 8, tail(c))
#define F(n, c...) (((long long) (head(c))) << (n)) | G(n + 8, tail(c))
#define G(n, c...) (((long long) (head(c))) << (n)) | H(n + 8, tail(c))
#define H(n, c...) (((long long) (head(c))) << (n)) /* extend here */

#define INSN_TO_ENUM(c...) A(0, c, 0, 0, 0, 0, 0, 0, 0)

enum insn {
    sysenter = INSN_TO_ENUM('s','y','s','e','n','t','e','r'),
    mov      = INSN_TO_ENUM('m','o','v')
};

int main()
{
    printf("sysenter = %llx\nmov = %x\n", sysenter, mov);
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 C 预处理获取字符串的整数值 的相关文章

  • 用于代数简化和求解的 C# 库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 网络上有很多代数求解器和简化器 例如 algebra com 上不错的代数求解器和简化器 然而 我正在
  • 每个托管线程是否都有自己对应的本机线程?

    我想知道是否在 Net 中创建托管线程 通过调用Thread Start 导致在后台创建一个本机线程 那么托管线程是否有对应的本机线程呢 如果是 当托管线程等待或睡眠时 是否意味着相应的本机线程也在等待或睡眠 是的 NET 线程映射到所有当
  • 如何将 protobuf-net 与不可变值类型一起使用?

    假设我有一个像这样的不可变值类型 Serializable DataContract public struct MyValueType ISerializable private readonly int x private readon
  • 如何让 Swagger 插件在自托管服务堆栈中工作

    我已经用 github 上提供的示例重新提出了这个问题 并为任何想要自己运行代码的人提供了一个下拉框下载链接 Swagger 无法在自托管 ServiceStack 服务上工作 https stackoverflow com questio
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 使用 LINQ2SQL 在 ASP.NET MVC 中的各种模型存储库之间共享数据上下文

    我的应用程序中有 2 个存储库 每个存储库都有自己的数据上下文对象 最终结果是我尝试将从一个存储库检索到的对象附加到从另一个存储库检索到的对象 这会导致异常 Use 构造函数注入将 DataContext 注入每个存储库 public cl
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 为什么调用非 const 成员函数而不是 const 成员函数?

    为了我的目的 我尝试包装一些类似于 Qt 共享数据指针的东西 经过测试 我发现当应该调用 const 函数时 会选择它的非 const 版本 我正在使用 C 0x 选项进行编译 这是一个最小的代码 struct Data int x con
  • 具有交替类型的可变参数模板参数包

    我想知道是否可以使用参数包捕获交替参数模式 例如 template
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表
  • 如何在 Xaml 文本中添加电子邮件链接?

    我在 Windows Phone 8 应用程序中有一些大文本 我希望其中有电子邮件链接 例如 mailto 功能 这是代码的一部分
  • C#:帮助理解 UML 类图中的 <>

    我目前正在做一个项目 我们必须从 UML 图编写代码 我了解 UML 类图的剖析 但我无法理解什么 lt
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成
  • C++ 函数重载类似转换

    我收到一个错误 指出两个重载具有相似的转换 我尝试了太多的事情 但没有任何帮助 这是那段代码 CString GetInput int numberOfInput BOOL clearBuffer FALSE UINT timeout IN
  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro

随机推荐

  • 地图查找性能

    仅当映射包含给定键时 我才想使用给定键的映射值执行某些操作 天真地我会写 Map
  • 如何在 PHP 中通过 IP 地址获取时区 [重复]

    这个问题在这里已经有答案了 我想通过 PHP 中的 IP 地址获取时区 实际上 我有一个将在客户端计算机上运行的应用程序 我有客户端机器的IP地址 但我无法获取每台客户端计算机的时区 ip 189 240 194 147 SERVER RE
  • vb.net - 将字符串编码为 UTF-8

    我创建了一个类来对字符串进行编码 Public Class UTF8 Public Shared Function encode ByVal str As String Dim utf8Encoding As New System Text
  • Visual Studio Code 断点出现在错误的位置

    在我的 Vue Vuex 项目中 我尝试使用 Visual Studio Code 进行调试 我使用 Chrome 调试工具正确启动调试器 并正确使用地图 但是当我尝试在 js 或 vue 文件中放置断点时 VS Code 似乎将断点放置在
  • 无法在 Ubuntu 13.04 上安装 rmagick gem

    当我尝试使用以下命令安装 rmagic 时 gem install rmagic 它给出错误 Building native extensions This could take a while ERROR Error installing
  • (Flutter) ListView.builder 使用 FutureBuilder 不起作用

    我正在尝试显示项目ListView using ListView builder里面一个FutureBuilder My future函数为FutureBuilder看起来像这样 fetchListItems async wait asyn
  • 只接受给定对象的键

    我正在尝试创建一个用对象初始化的 TypeScript 类 并且有一个只能将该对象的键作为参数的方法 所以 class MyClass properties constructor properties this properties pr
  • Telegram 客户端消息发送限制是什么?

    From here https core telegram org bots faq我知道 Telegram 对 BOT 消息的限制如下 gt 每个聊天 1 条消息 秒 gt 30 条消息 秒不同的聊天 碰巧我没有使用python tele
  • 是否可以将 Assembly.ReflectionOnlyLoad 与发布者策略/程序集版本控制一起使用?

    我的目标 我们允许将我们的产品与第三方组件 库 集成 这些组件由于许可而未作为我们产品的一部分安装 目前 我们只想加载与第三方组件相关的功能 前提是这些组件安装在客户端计算机上 目前的解决方案 我在用着Assembly Reflection
  • Unix tcsh - 使用命令行参数 $1 与 \!:1 的别名

    在 Unix tcsh 中 我使用两种不同的符号在别名中引用了命令行参数 1 and 1 但我注意到如果我尝试保存 1到环境变量 它不会被保存 然而 1确实得救了 alias hear setenv x 1 echo x gt hear t
  • Google Directions API 使用 UTC 还是当地时间?

    我正在开发一个交通导航应用程序 使用谷歌路线API https developers google com maps documentation directions API 要求我提交出发时间 departure time 用于交通查询
  • NoClassDefFoundError - Eclipse 和 Android

    我在尝试运行 Android 应用程序时遇到问题 在将第二个外部库添加到其构建路径之前 该应用程序工作正常 自从添加了 Scoreninja jar 后 我现在得到了没有发现类定义错误当我尝试运行该应用程序时 这是消息 02 11 21 4
  • 如何实现服务器端超时? (对 http.Server 超时感到困惑)

    我正在尝试为我的服务实现服务器端超时 如果请求时间超过 X 秒 服务器应返回 503 Service Unavailable 我知道这可以通过将所有端点包装在http TimeoutHandler https golang org pkg
  • 在 MS Access 中对表单上的按钮进行编码

    我正在尝试使用 MS Access 构建数据库 我有两个表 StockFrames 和 Projects 还有一个表单 FrameCheckOut 在表单上 我有一个 FrameID 字段 我们将在其中输入框架 ID 号或扫描其条形码 和一
  • API 2.2 中没有这样的表

    我的应用程序在较高版本中一切顺利 但在较低版本 例如 2 2 中 应用程序在从数据库获取数据时崩溃并出现此错误 07 17 21 46 36 361 I Database 520 sqlite returned error code 1 m
  • 在可可状态应用程序中显示图像

    你好 我开发了一个可可状态应用程序 例如 当我放置一个长标题时 它无法显示 如果我也放置一个图像作为图标 它也无法显示 但如果我放置一个小标题 它就可以正常工作 我该如何解决这个问题并使图像显示出来 statusItem NSStatusB
  • 块控制+Alt+删除

    I am doing an Online Quiz project in C The test client is a Windows Desktop Application running on Windows XP I need to
  • Spark JDBC 伪列不起作用

    对于我的用例 我尝试使用 Spark JDBC 读取一张大的 Oracle 表 因为我的表中没有整数类型列 所以我正在使用rownum as paritionColumn 我的 Spark 查询如下所示 为了测试 我使用只有 22000 行
  • Objective-C/cocoa框架中的NSAutoreleasePool有什么魔力?

    我发现 Objective C cocoa 框架的示例有以下代码 int main NSAutoreleasePool pool NSAutoreleasePool alloc init Create an array NSArray mo
  • 使用 C 预处理获取字符串的整数值

    我将如何创建一个C宏获取字符串的整数值 具体用例来自一个问题here https stackoverflow com questions 9524342 how to specify enum size in gcc 我想像这样更改代码 e