【问题标题】:Check if const array is sorted during compile time (C language)检查 const 数组是否在编译时排序(C 语言)
【发布时间】:2015-09-03 09:50:41
【问题描述】:

在 C 语言中,如何在编译时检查 const 数组是否已排序(按升序)。

给定一个这样的数组: const int a[] = {4,5,6,8};

如果上面的数组没有排序,编译应该会失败。

这可能吗?

【问题讨论】:

  • 你不能用 C 编译器检查它。您需要使用单独的工具。
  • 条件预处理器可以提供帮助
  • @Dayalrai :请您详细说明一下。或者帮助为此编写代码。
  • 您可以定义 MACRO 来检查数组是否已排序。在失败的情况下使用#if ..#error ..#endif
  • 确保内容正确的一种有趣且有趣的方法是生成此类内容。例如。使用 f#:let sb = new System.StringBuilder() in sb.Write("static const int a["); let a = [4..8] in sb.Write(a.Length.ToString()); sb.WriteLine("] = {"); a |> List.iter (fun v -> sb.Write(sprintf "%d, " v)); sb.WriteLine("};"); System.IO.File.WriteAllText(@"E:\temp\myarray.txt", sb.ToString())

标签: c compilation


【解决方案1】:

非常在编译时一般很难做到,使用标准工具(预处理器等)甚至可能是不可能的。

也许更好的解决方案是在数组创建后尽快简单地让代码检查它(您也可以像 assert 一样禁用它):

const int a[] = { 4, 5, 6, 8 };
#ifndef NDEBUG
for (int i = 1; i < sizeof(a) / sizeof(a[0]); i++) {
    if (a[i-1] > a[i]) {
        fprintf (stderr, "%s(%d) Check your arrays\n", __FILE__, __LINE__);
        exit(1);
    }
}
#endif

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 2019-07-04
    • 1970-01-01
    相关资源
    最近更新 更多