实现编译时机制检查字符串的唯一性

2024-04-10

定义我的问题的最简单方法是我正在尝试实现一种机制来检查是否已使用相同的字符串(或一对(数字,字符串))。我希望使用 C 预处理器以智能方式实现此机制。我还希望这种机制在调试模式下出现冲突或运行时错误时(通过检查断言)给我编译错误。我们不希望开发人员在添加消息时犯错误,因为每条消息都应该是唯一的。我知道这可以通过计算哈希来完成,或者例如crc/md5但这种机制很容易发生冲突,我需要避免这种情况。至关重要的是,每条消息只能使用一次。

该机制的行为示例:

addMessage(1, "Message1") //OK 
addMessage(2, "Message2") //OK 
. 
. 
. 
addMessage(N, "MessageN") //OK 
addMessage(2, "Message2") //Compile error, Message2 has already been used 

替代行为(调试代码时):

addMessage(1, "Message1") //OK 
addMessage(2, "Message2") //OK 
. 
. 
. 
addMessage(N, "MessageN") //OK 
addMessage(2, "Message2") //Assertion failed, because Message2 has already been used 

首选的方法是巧妙地使用#define and #undef指令。一般来说,预处理器应该以聪明的方式使用(我不确定这是否可能)也许可以通过适当的宏组合来实现?任何 C 预处理器黑客可以帮助我解决这个问题吗?

//编辑:我需要这些消息在全球范围内是唯一的,而不仅仅是在一个代码块内(如 if 语句的函数)。

//EDIT2:问题的最佳描述是我有 100 个不同的源文件,我想使用预处理器进行检查(或者可能是除了每次在编译开始时使用脚本解析源文件之外的其他机制)如果多次使用字符串(或预处理器定义),这将非常耗时,并且会为足够复杂的项目添加另一个阶段。我仍然不知道该怎么做(我知道这可能根本不可能,但我希望它实际上是不可能的)。


这将在重复字符串上产生错误:

constexpr bool isequal(char const *one, char const *two) {
  return (*one && *two) ? (*one == *two && isequal(one + 1, two + 1))
    : (!*one && !*two);
}

constexpr bool isunique(const char *test, const char* const* list)
{
    return *list == 0 || !isequal(test, *list) && isunique(test, list + 1);
}

constexpr int no_duplicates(const char* const* list, int idx)
{
    return *list == 0 ? -1 : (isunique(*list, list + 1) ? no_duplicates(list + 1, idx + 1) : idx);
}

template <int V1, int V2> struct assert_equality
{
    static const char not_equal_warning = V1 + V2 + 1000;
};

template <int V> struct assert_equality<V, V>
{
    static const bool not_equal_warning = 0;
};

constexpr const char* l[] = {"aa", "bb", "aa", 0};
static_assert(assert_equality<no_duplicates(l, 0), -1>::not_equal_warning == 0, "duplicates found");

g++ 的输出:

g++ -std=c++11 unique.cpp 
unique.cpp: In instantiation of ‘const char assert_equality<0, -1>::not_equal_warning’:
unique.cpp:29:57:   required from here
unique.cpp:20:53: warning: overflow in implicit constant conversion [-Woverflow]
unique.cpp:29:1: error: static assertion failed: duplicates found

'assert_equality' 的第一个模板参数(在本例中为 0)告诉您重复字符串的第一个位置。

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

实现编译时机制检查字符串的唯一性 的相关文章

  • 如何获取正在访问 ASP.NET 应用程序的当前用户?

    为了获取系统中当前登录的用户 我使用以下代码 string opl System Security Principal WindowsIdentity GetCurrent Name ToString 我正在开发一个 ASP NET 应用程
  • 如何使用 C# 中的参数将用户重定向到 paypal

    如果我有像下面这样的简单表格 我可以用它来将用户重定向到 PayPal 以完成付款
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • 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
  • 按成员序列化

    我已经实现了template
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • C# 中通过 Process.Kill() 终止的进程的退出代码

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

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co

随机推荐

  • React Native - 设置 secureTextEntry 时无法更改字体

    const entryInput forwardRef props ref gt return
  • 从 url 获取子域名?

    我需要从 url 中获取一些值 就像如果网址是http www random mysite com 然后我想以某种方式得到random 但是如果使用的话这应该也有效www http or https 网址前面 那么如何才能做到这一点呢 我试
  • 如何使用 ORMLite 查询构建器获取表中的总记录

    如同 select count from tablename 在 ORMLITE 中应该查询什么 我尝试过类似的东西 int total dao queryBuilder select count 如何使用 ORMLite 查询构建器获取表
  • JavaScript .hashchange 性能。它能带来任何放缓吗?

    jQuery hashchange 事件 http benalman com projects jquery hashchange plugin 对我来说 它看起来是目前最成熟的解决方案 如果我错了 请纠正我 我真的很喜欢这个用于操作浏览器
  • Facebook Messenger 平台/机器人欢迎配置出现奇怪错误

    我在为 Messenger 机器人配置欢迎消息时遇到奇怪的错误 我一直在使用相同的代码 如下所示 直到昨晚它一直工作正常 我尝试了 cURL 和Postman https www getpostman com 它们都不起作用 curl X
  • 适用于 Android 的 USB 主机

    I am trying to communicate with my freeduino board which is similar to arduino uno via usb through android device nexus
  • 在Java中检查服务器上的路径是否存在[重复]

    这个问题在这里已经有答案了 我正在创建一个 Java 程序 在其中将文件上传到特定路径上的服务器 我在用jSch for sftp 因此 在上传文件之前 我想检查服务器上是否存在给定的目录 if path exists upload fil
  • 使用 AVAudioEngine 将 AVAudioInputNode 连接到 AVAudioUnitEffect

    我想处理来自设备内置麦克风的音频 AVAudioInputNode 带有音频单元效果 AVAudioUnitEffect 对于我的例子 我正在使用AVAudioUnitReverb 连接中AVAudioUnitReverb导致应用程序崩溃
  • Swift 3:从 UIBezierPath 创建 UIImage

    我有一个UIBezierPath 我最终需要一个UIImageView从中 现在我正在尝试首先创建一个UIImage 然后是一个UIImageView从那 我正在快速工作 并且我已经研究过类似的问题 并且答案要么不起作用 要么产生形状而不是
  • ASP.NET MVC 1 向前兼容 ASP.NET MVC 2 吗?

    我可以使用 MVC 2 程序集顺利运行 MVC 1 应用程序吗 我知道一些 3rd 方工具在 MVC 2 中出现了问题 但我们假设我没有使用这些其他工具 曾经有过重大变化 http go microsoft com fwlink LinkI
  • Pandas:将 Lambda 应用于多个数据帧

    我试图弄清楚如何同时将 lambda 函数应用于多个数据帧 而不需要先将数据帧合并在一起 我正在处理大型数据集 gt 60MM 记录 并且需要格外小心内存管理 我希望有一种方法可以将 lambda 应用于底层数据帧 这样我就可以避免首先将它
  • SSIS Excel 目标空白

    我正在调试一个 SSIS 包 该包从 SQL Server 数据开始 对其进行转换 然后将其放入 Excel 文件中 我在工作中经常这样做 以前从未遇到过这个问题 Excel 文件中没有写入任何行 我将数据查看器附加到通向 Excel 目标
  • Android:如何以编程方式连接/断开 OTG

    我想在我的 Android 设备中以编程方式连接和断开 USB OTG 笔式驱动器 硬盘驱动器等 对于USB 我使用以下路径在连接到PC时绑定 取消绑定USB sys bus usb drivers usb bind or unbind 我
  • Python:读取文件时如何忽略#comment行

    在Python中 我刚刚从文本文件中读取了一行 我想知道如何编写代码来忽略行开头带有哈希 的注释 我认为应该是这样的 for if line contain then process line else end for loop 但我是Py
  • JavaScript 对象如何引用其自身的值? [复制]

    这个问题在这里已经有答案了 假设我有以下 JavaScript var obj key1 it key2 key1 works alert obj key2 此错误显示 key1 未定义 我努力了 this key1 this key1 o
  • 单个部分的垂直滚动

    我必须制作一个具有垂直滚动过渡效果的部分 请观看此处的视频以供参考 https drive google com file d 1Fy4BDqc0 LDrPnEVYuQZdiJ0Pk9qDXA5 view usp sharing https
  • 将自定义对象传递给 Web 服务

    我正在使用 C 并且有 Windows 窗体和 Web 服务 我有一个自定义对象 我想将其发送到网络服务 有时 该对象可能包含大量数据 作为最佳性能 将自定义对象发送到 Web 服务的最佳方式是什么 Web 服务旨在处理自定义对象 只要它们
  • 使用 cython 加速数千个集合操作

    我一直在努力克服对 Cython 的恐惧 恐惧是因为我对 c 或 c 一无所知 我有一个函数需要 2 个参数 一个集合 我们称之为testSet 和一个集合列表 我们称之为targetSets 然后该函数会迭代targetSets 并计算与
  • 如何保护 Google Kubernetes Engine (GKE) 中的只读端口 10255?

    我创建了一个 GKE 私有集群 版本 1 13 6 gke 13 使用以下命令 gcloud container clusters create a cluster with user pass network vpc name subne
  • 实现编译时机制检查字符串的唯一性

    定义我的问题的最简单方法是我正在尝试实现一种机制来检查是否已使用相同的字符串 或一对 数字 字符串 我希望使用 C 预处理器以智能方式实现此机制 我还希望这种机制在调试模式下出现冲突或运行时错误时 通过检查断言 给我编译错误 我们不希望开发