代码之家  ›  专栏  ›  技术社区  ›  Wonko the Sane

C++程序中C++常数的使用

  •  4
  • Wonko the Sane  · 技术社区  · 14 年前

    我们有一种情况,在C语言(WPF)应用程序中使用一组第三方非托管C++库,但我们也使用它们的包含库的子集来构建我们自己的非托管库,以便在我们的应用程序中使用。

    这些库生成元数据,元数据存储在数据库中。但是,为了使用元数据,我们必须在C代码中复制一些与此元数据相关的常量。

    如果这些常量中的一些在版本之间发生变化,那么就有一个潜在的问题。C语言应用程序是否使用C++中定义的常量包含文件的方式是干净的?

    水处理系统

    2 回复  |  直到 14 年前
        1
  •  3
  •   Hut8    14 年前

    我有一个解决方案,你可能不认为非常“干净”,但这将工作。问题是,使用enum或define预处理器指令都会丢弃用于常量的符号名(比如ERR OUT OF MEMORY实际上只是一个整数)。

    在C++代码中,可以定义一个函数,该函数取符号的字符串名称并返回其值。可以使用std::map,然后添加std::pair(“ERR\u OUT \u OF \u MEMORY”,ERR\u OUT \u OF \u MEMORY)之类的对,然后可以使用DllImportAttribute从DLL调用该函数,DllImportAttribute允许.NET中的非托管互操作。不幸的是,这需要遍历并字符串化常量,但好处是如果这些常量发生更改,它将是自动的。

    另一种解决方案是编写一个简单的脚本,通过预处理器#定义并创建一个巨大的.NET类,其中包含一组同名的静态常量。考虑到预处理器的简单性(只需要几行Perl代码),这实际上并不难

        2
  •  3
  •   Reed Copsey    14 年前

    您需要在C#包装器类的C#内部重新定义它们。

    不幸的是,如果常量更改,您也需要修改您的副本(但是,在版本之间更改常量值是一个非常糟糕的主意,所以希望第三方API不会这样做……)


    也就是说,这是有选择的。例如,您可以使用使用API的小型C++程序,并将所有常量写入到.cs文件中,格式正确。如果常量在不同版本之间发生变化(至少,如果值发生变化),这将保护您,但是如果需要,您仍然需要更新程序以在将来的版本中处理其他常量。