C 宏将字符串转换为 pascal 字符串类型

2023-12-14

我想要一些关于宏的想法,用于将预处理器定义的字符串转换为 pascal 类型字符串,然后能够使用宏来初始化 const char 数组等。

像这样的事情会很棒:

#define P_STRING_CONV(str) ...???...

const char *string = P_STRING_CONV("some string");

struct
{
    char str[30];
    ...
}some_struct = {.str = P_STRING_CONV("some_other_string")};

我已经尝试过这样的事情:

#define DEFINE_PASCAL_STRING(var, str, strlen) struct {uint8_t len; char content[strlen-1];} (var) = {sizeof(str)-1, (str)}

(可以删除 strlen 参数,但我需要一个定义的大小。)

这工作正常,但不能用于初始化结构中的元素。对于 const char 数组,我需要将其转换为其他变量。

有什么好主意吗?


将字符串转换为 pascal 字符串类型

要转换一个字符串字面量, _Generic and 复合文字将接近OP目标。

为了获得更好的解决方案,更多细节和示例用例将有助于说明 OP 的目标。

#define P_STRING_CONV(X) _Generic((X)+0, \
  char *: &((struct {char len; char s[sizeof(X)-1]; }){ (char)(sizeof(X)-1), (X) }).len \
  )

void dump(const char *s) {
  unsigned length = (unsigned char) *s++;
  printf("L:%u \"", length);
  while (length--) {
    printf("%c", *s++);
  }
  printf("\"\n");
}

int main(void) {
  dump(P_STRING_CONV(""));
  dump(P_STRING_CONV("A"));
  dump(P_STRING_CONV("AB"));
  dump(P_STRING_CONV("ABC"));
  return 0;
}

Output

L:0 ""
L:1 "A"
L:2 "AB"
L:3 "ABC"

@乔纳森莱夫勒建议创建的类似 pascal 的字符串也包含终止符空字符。要使用上面的代码执行此操作,只需进行简单的更改sizeof(X)-1 into sizeof(X)。然后通过访问pascal_like_string + 1,代码有一个指向有效 C 字符串的指针。


(X)+0将数组类型转换为指针

sizeof(X)-!!sizeof(X)生成字符串文字的大小,不计算其 \0。至少 1 个。

struct {char len; char s[sizeof(X)-!!sizeof(X)]; }是一个大小合适的类似帕斯卡的结构。

(struct {char len; char s[sizeof(X)-!!sizeof(X)]; }){ (char)(sizeof(X)-1), (X) } is a 复合文字.


下面将转换一个Cstring到类似帕斯卡的字符串。请注意,作为类似帕斯卡的字符串,没有'\0'.

#include <limits.h>
#include <stdlib.h>
#include <string.h>
char *pstring_convert(char *s) {
  size_t len = strlen(s);
  assert(len <= UCHAR_MAX);
  memmove(s+1, s, len);
  s[0] = (char) (unsigned char) len;
  return s;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 宏将字符串转换为 pascal 字符串类型 的相关文章

  • 进程何时获得 SIGABRT(信号 6)?

    C 中进程获得 SIGABRT 的场景有哪些 该信号是否始终来自进程内部 或者该信号可以从一个进程发送到另一个进程吗 有没有办法识别哪个进程正在发送该信号 abort 向调用进程发送SIGABRT信号 就是这样abort 基本上有效 abo
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • 迭代变量并查找特定类型实例的技术

    我想迭代进程中内存中的变量 通过插件动态加载 并查找特定类型的实例 以前我可以找到特定类型 或内存中的所有类型 我可以创建类型的实例 我可以获取作为不同类型的字段包含的实例 但我无论如何都不知道只是 搜索 特定类型的实例 一种方法是使用 W
  • 使用具有现有访问令牌的 Google API .NET 客户端

    用例如下 移动应用程序正在通过 Google 对用户进行身份验证 并且在某些时候 我们需要将用户的视频发布到他的 YouTube 帐户 出于实际原因 实际发布应该由后端完成 已经存储在那里的大文件 由于用户已经通过应用程序的身份验证 因此应
  • C++:重写已弃用的虚拟方法时出现弃用警告

    我有一个纯虚拟类 它有一个纯虚拟方法 应该是const 但不幸的是不是 该接口位于库中 并且该类由单独项目中的其他几个类继承 我正在尝试使用这个方法const不会破坏兼容性 至少在一段时间内 但我找不到在非常量方法重载时产生警告的方法 以下
  • 构造函数中显式关键字的使用

    我试图了解 C 中显式关键字的用法 并查看了这个问题C 中的explicit关键字是什么意思 https stackoverflow com questions 121162 但是 那里列出的示例 实际上是前两个答案 对于用法并不是很清楚
  • JSON 数组到 C# 列表

    如何将这个简单的 JSON 字符串反序列化为 C 中的列表 on4ThnU7 n71YZYVKD CVfSpM2W 10kQotV 这样 List
  • 如何使用recv()检测客户端是否仍然连接(并且没有挂起)?

    我写了一个多客户端服务器程序C on SuSE Linux 企业服务器 12 3 x86 64 我为每个客户端使用一个线程来接收数据 我的问题是 我使用一个终端来运行服务器 并使用其他几个终端来运行服务器telnet到我的服务器 作为客户端
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • 将数据打印到文件

    我已经超载了 lt lt 运算符 使其写入文件并写入控制台 我已经为同一个函数创建了 8 个线程 并且我想输出 hello hi 如果我在无限循环中运行这个线程例程 文件中的o p是 hello hi hello hi hello hi e
  • Azure 事件中心 - 按顺序接收事件

    我使用下面的代码从 Azure Event Hub 接收事件 https learn microsoft com en us azure event hubs event hubs dotnet framework getstarted s
  • C# 中条件编译符号的编译时检查(参见示例)?

    在 C C 中你可以这样做 define IN USE 1 define NOT IN USE 1 define USING system 1 system 1 IN USE 进而 define MY SYSTEM IN USE if US
  • 当“int”处于最大值并使用 postfix ++ 进行测试时,代码定义良好吗?

    示例 未定义行为的一个示例是整数溢出的行为 C11dr 3 4 3 3 int溢出是未定义的行为 但这是否适用于存在循环的以下内容 并且不使用现在超出范围的副作用i 特别是 这是否后缀增量规格帮助 结果的值计算在副作用之前排序 更新操作数的
  • 当我“绘制”线条时,如何将点平均分配到 LineRenderer 的宽度曲线?

    我正在使用线条渲染器创建一个 绘图 应用程序 现在我尝试使用线条渲染器上的宽度曲线启用笔压 问题在于 AnimationCurve 的 时间 值 水平轴 从 0 标准化为 1 因此我不能在每次添加位置时都在其末尾添加一个值 除非有一个我不知
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • 为什么拆箱枚举会产生奇怪的结果?

    考虑以下 Object box 5 int int int box int 5 int nullableInt box as int nullableInt 5 StringComparison enum StringComparison
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没
  • 实例化 Microsoft.Office.Interop.Excel.Application 对象时出现错误:800700c1

    实例化 Microsoft Office Interop Excel Application 以从 winforms 应用程序生成 Excel 时 出现以下错误 这之前是有效的 但突然间它停止工作了 尽管代码和 Excel 版本没有变化 我
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop

随机推荐

  • 如何在 XAMPP 下配置 MySQL 以使用 IPv6 [关闭]

    Closed 这个问题是无关 目前不接受答案 我有 XAMPP v 3 1 0 出于测试目的 我需要使用 IPv6 格式连接到 MySQL 数据库 如何配置MySQL 找到我的 ini 更改 取消注释bind address for ipv
  • is_const::value 为 false ——为什么? [复制]

    这个问题在这里已经有答案了 为什么这个静态断言会触发 static assert std is const
  • 在 vue.js 路由加载之前检查权限

    有谁知道如何在渲染 vue js 路由之前检查用户的权限 我通过检查权限提出了部分解决方案created组件的阶段 created function var self this checkPermissions function resul
  • 如何使用 JavaConfig 从 Spring Security 中删除 ROLE_ 前缀?

    我正在尝试删除 Spring Security 中的 ROLE 前缀 我尝试的第一件事是 http servletApi rolePrefix 这不起作用 所以我尝试创建一个BeanPostProcessor如建议的http docs sp
  • 生命游戏数组索引越界

    我正在玩康威的生命游戏 我很确定我即将完成 但是当我运行它时 我得到Exception in thread main java lang ArrayIndexOutOfBoundsException 1 at game of life Ga
  • 从表中选择 *,其中日期 = 今天

    需要 PHP MySql 帮助 需要选择 今天 的所有记录 我的表有一列包含 unix 时间戳 我只想从表中选择 unix 时间戳 今天 很高兴在 Linux 命令行上执行此操作 只需要基本的 MySql 查询 我会选择 SQL 版本 SE
  • 显示 BLOB 图像 Laravel 4

    我在 mysql 上添加了 png 图像作为 BLOB 但是当我尝试检索它们时 我将它们作为文件获取 但无法显示为图像 下面是我的代码 控制器 public function post news image Input file image
  • 控制 ASP.Net MVC 中的输出缩进

    我的同事非常 热衷 将格式正确且缩进的 html 传送到客户端浏览器 这是为了使页面源代码易于被人阅读 首先 如果我有一个在站点中多个不同区域使用的部分视图 渲染引擎是否应该自动为我设置缩进格式 例如在 XmlTextWriter 上设置
  • ImageView圆角[重复]

    这个问题在这里已经有答案了 我希望图像有圆角 我实现了这个 xml 代码并在我的图像视图中使用它 但图像与形状重叠 我正在通过异步任务下载图像
  • ios音频单元remoteIO录音时播放

    我被要求将 VOIP 添加到游戏中 跨平台 因此无法使用 Apple gamekit 来做到这一点 已经有三四天了 我一直在努力让我的注意力集中在音频单元和远程IO上 我忽略了数十个示例等 但每次都只是对输入 PCM 应用简单的算法并在扬声
  • 使用 NSXMLParser 解析 XML

    我有一个关于 xml 解析的问题 通常 XML文件的样式是这样的
  • 如何在spark scala中使用带有2列的array_contains?

    我有一个问题 我想检查字符串数组是否包含另一列中存在的字符串 我目前正在使用下面的代码 该代码给出了错误 withColumn is designer present when array contains col list of desi
  • R 中的双冒号 (::) 是什么?

    我正在关注 Rbloggers 中的教程 发现双冒号的使用 我在网上查找 但找不到其使用的解释 这是它们的使用示例 df lt dplyr data frame year c 2015 NA NA NA trt c A NA B NA 我知
  • Greasemonkey @require 在 Chrome 中不起作用

    我正在尝试使用 Greasemonkey 添加 jQuery require include方法 但是不起作用 显示以下错误 Uncaught ReferenceError is not defined repeated 10 times
  • WinForm c#:检查首次运行并显示消息

    我正在创建一个包含首次运行检查的 winform 应用程序 我一直在关注这两篇文章 如何检查程序是否是第一次运行 C 中的 Windows 窗体用户设置 首次运行检查应该检查应用程序是否曾经运行过 如果没有运行过 它应该向用户显示一些消息
  • 在 TypeScript 中扩展特定类型的数组

    我知道如何扩展任何类型的数组 declare global interface Array
  • MongoDB NodeJS 本机驱动程序(mongodb) 与 Mongo Shell 性能对比

    我在 MongoDB 表 1 中有 10000 条记录 数据如下 id ObjectId 5d5e500cb89312272cfe51fc cities cityid 5d5d2205cdd42d1cf0a92b33 value XYZ c
  • Android 活动识别不适用于 Nexus 5

    我有一个正在使用谷歌活动识别更新的代码 现在突然之间 这些似乎每秒发送几次更新 或者从不发送更新 尽管每 20 秒请求一次 我没有更改代码并检查了早期版本 但遇到了同样的问题 我根据教程构建了一个最小的示例 但我的 Nexus 5 设备没有
  • 量词与非量词

    我有一个关于量词的问题 假设我有一个数组 我想计算该数组的数组索引 0 1 和 2 declare const cpuA Array Int Int assert or select cpuA 0 0 select cpuA 0 1 ass
  • C 宏将字符串转换为 pascal 字符串类型

    我想要一些关于宏的想法 用于将预处理器定义的字符串转换为 pascal 类型字符串 然后能够使用宏来初始化 const char 数组等 像这样的事情会很棒 define P STRING CONV str const char strin