- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个主要用 C# 编写的项目。我需要为该项目的 API 的所有错误编号“定义”定义一个类。我试图避免编写/更改我的许多代码生成器之一来实现这一点。
我想做的是能够将 #include
内容(如错误文件)直接放入 C/C++ 项目中。我在 C# 中将它们定义如下,我没有为您将在此处看到的内容使用枚举:
using System;
namespace ProjectAPI {
[Serializable]
public sealed class ProjectError {
public enum ProjectErrorClass {
None = -1,
Undefined = 0,
Login,
Store,
Transaction,
Heartbeat,
Service,
HTTPS,
Uploader,
Downloader,
APICall,
AutoUpdate,
General
}
public enum ProjectErrorLevel {
Unknown = -1,
Success = 0,
Informational,
Warning,
Critical,
};
/// <summary>
/// PROJECT_ERROR_BASE - This is the base for all Project defined errors in the API. Project Errors are defined as follows:
/// ProjectAPI error values are 32 bit values defined as follows:
/// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
/// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
/// +---+---------------+-----------------------+------------------+
/// |Sev|Error Code Base| Error Class |Unique Error Code |
/// +---+---------------+-----------------------+------------------+
/// where
///
/// Sev - is the severity code of the error (2 bits), and is defined as follows:
/// 00 - Success (non-fatal) 0x00
/// 01 - Informational 0x01
/// 10 - Warning 0x02
/// 11 - Error 0x03
///
/// Error Code Base - is the starting point of all Project Errors, and is set at 0xA4 (8 Bits).
///
/// Error Class - is the error class, or API "Module" that caused the error (12 bits).
///
/// Code - the unique error code (10 bits). (0 - 1,023 (0x3FF)).
/// </summary>
private static readonly int ERR_SHIFT = 0x1E;
private static readonly int BASE_SHIFT = 0x16;
private static readonly int CLASS_SHIFT = 0x06;
private static readonly int PROJECT_SEV_SUCCESS = 0x00;
private static readonly int PROJECT_SEV_INFO = 0x01;
private static readonly int PROJECT_SEV_WARN = 0x02;
private static readonly int PROJECT_SEV_ERROR = 0x03;
private static readonly int PROJECT_ERROR_BASE = 0xA5;
/// <summary>
/// Project Error Class Constants:
/// </summary>
private static readonly int PROJECT_ERROR_CLASS_UNDEF = 0x0010; /// Undefined.
private static readonly int PROJECT_ERROR_CLASS_LOGIN = 0x0020; /// LoginClass Error.
private static readonly int PROJECT_ERROR_CLASS_STORE = 0x0040; /// Store Error.
private static readonly int PROJECT_ERROR_CLASS_TRANS = 0x0080; /// Transaction Error.
private static readonly int PROJECT_ERROR_CLASS_HEART = 0x0100; /// HeartBeat (Project Health Monitor) Error.
private static readonly int PROJECT_ERROR_CLASS_SERV = 0x0200; /// Service Error.
private static readonly int PROJECT_ERROR_CLASS_HTTP = 0x0400; /// HTTP/HTTPS Error.
private static readonly int PROJECT_ERROR_CLASS_UPLOAD = 0x0800; /// Upload (Transactions) Error
private static readonly int PROJECT_ERROR_CLASS_DOWNLOAD = 0x1000; /// Download (Transactions) Error
private static readonly int PROJECT_ERROR_CLASS_APICALL = 0x2000; /// API Command/call error.
private static readonly int PROJECT_ERROR_CLASS_UPDATE = 0x4000; /// Auto-Updater Errors.
private static readonly int PROJECT_ERROR_CLASS_GEN = 0x8000; /// General Error.
public static readonly int PROJECT_ERROR_UNKNOWN_ERROR = ProjectErrCode(PROJECT_SEV_ERROR, PROJECT_ERROR_CLASS_GEN, 0x001);
// Was...
// (((PROJECT_SEV_ERROR << ERR_SHIFT) | PROJECT_ERROR_BASE << BASE_SHIFT) | ((PROJECT_ERROR_CLASS_UNDEF << CLASS_SHIFT) | 0x0001));
public static readonly int PROJECT_ERROR_UNKNOWN_HEARTBEAT_ERROR = ProjectErrCode(PROJECT_SEV_ERROR, PROJECT_ERROR_CLASS_HEART, 0x001);
...Snip...
...
我意识到我还可以将其他东西放入枚举中,但我的目标是也能够使用 C++ 编译器编译此源代码。 (上面的示例中缺少函数,即 ProjectErrCode()
,它在从 API 调用时构建错误代码 OTF 的最终整数值。)
我正在构建错误常量,如评论中所示,我可以回到那个,但我宁愿编写类似的类 - 一个在 C# 中,一个在 C++ 中,可以构造/解构错误代码。我的函数返回错误的严重性、错误类别等。开发人员可以忽略它、记录它、将它传递给 UI 等。
如果我只有 5 或 10 个错误代码,这就不是问题。但我有超过 100 个,真的不想维护包含重复信息的 .cs 和 .h 文件。我可以在 .h 文件中管理它们并让 CS 代码读取它们,但这几乎与编写(修改)代码生成器一样多。
我如何#define
以我的方式访问单个源文件,以便 C# 编译器可以编译它,就像 C/++ 编译器一样?我可以简单地 #include "ProjectErrors.cs"
- 文件名不是问题。我开始想我可以通过 #define
'ing 之类的东西来做到这一点,比如 using System;
但几乎被卡在那里了。
最佳答案
1) 使用预处理器。一些 ifdef 和定义应该可以解决问题,但它会非常困惑。
2) 使用 C++/CLI。 C++/CLI 是 C++ 的变体,它被编译成 .Net 程序集。虽然 .Net 类型和 native 类型是独立的实体,但它们之间的转换是可能的。
例如,您将 header 定义为具有原生枚举和常量的完全原生代码;然后,您可以将此 header 包含到 100% native 项目和 C++/CLI 项目中,这还将提供枚举到相应 .Net 类型的转换 ( see this thread)。
如果您不想拥有这个中间转换层,C++/CLI 还为您提供了 C++ 宏的全部功能,因此您可以使用 ENUM_HEADER 和 CONSTANT 等宏创建一个文件,并将它们评估为适当的托管或 native 以相当干净和直接的方式形成(你不能用 C# 做,因为它有更弱的预处理器)。生成的程序集基本上就是这个 header 和适当的宏定义,除此之外别无其他。
3) 在某些外部文件(XML、INI 等...)中定义值,并且只在 C# 和 C++ 中实现加载逻辑(这实际上可能是最干净的解决方案)。
关于c# - 在 C# 和 C++ 之间共享源文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19914398/
我有一个项目,其中包含两个源文件和一个头文件(其中包含名为 Get.c 的源文件之一中定义的函数的原型(prototype)),问题是: 当我在另一个源文件中包含 Get.c 时,它给出了错误 错误:
有没有尽可能多的语法结构的java源代码文件? java 编译器的某种测试文件。我需要该文件来测试 java 源代码解析器。 最佳答案 看看 Java Compatibility Kit ,特别Tec
尝试在命令提示符下编译时,我在使用 codeblocks-16.01mingw-setup.exe - 安装在路径不包含空格的文件中时遇到问题。初学者指南建议在命令提示符中使用以下行: gcc car
我编写了一个使用 Cryptopp 库的程序。我已经创建了静态库并将其包含在我的分发版中,但是该程序还需要很多头文件。我的问题是我需要在我的发行版中包含所有这些头文件吗? 例如,我编写了一个代码,其中
我在源代码树中有 protobuf 原型(prototype)文件。我想在每次更改和首次运行时从原型(prototype)文件生成源文件(例如,我创建新的原型(prototype)文件)。然后,我想从
我知道在 Java 中加载文件而不指定要使用的编码是平台相关的。但我的问题是关于 .java 源文件本身中包含的文本:用于这些文件的编码是否仍然相关一旦编译? 例如,如果我在 Windows 上有一个
编辑:{ 我想我在这里添加了很多(太多)信息(阅读)。我想要的是: 我正在使用一个网站(没有.csproj文件) 我需要多个源代码文件才能运行我的aspx 据我所知,当请求aspx文件时,我要么需要使
我从 Asio 的示例页面中获取了以下代码 class tcp_connection : public boost::enable_shared_from_this { public: t
我已经使用 VS2010 为我的 C++ 应用程序创建了一个 Windows 安装部署。但是我的问题是我不知道如何将我自己的一些代码压缩到安装向导中(这可能吗?)。问题是在安装过程中我想要: 要求用户
最近我创建了一个 bash 脚本,我应该在 cron 中运行它。 准备好bash脚本并正常运行后,我将其放入Cron中,发现它失败了。作为第二步,我删除了所有环境依赖项,即我指定的不是 file.tx
考虑以下场景 例子.txt: ÄäÖöÜü Java 源代码: try (FileInputStream fileInputStream = new FileInputStream("example.
背景我主要使用嵌入式 C/C++ 进行编程,但有时我必须为我们的 API 进行一些 C# 编程。为此,我使用 Visual Studio 2017 为我们的客户创建 API DLL。 C# API 和
这个问题在这里已经有了答案: ggplot's qplot does not execute on sourcing (1 个回答) 关闭 9 年前。 考虑这种形式的源文件: # initializ
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我需要读取一个 Racket 源文件并通过宏扩展来运行它。我有一个简单的测试文件,Racket 本身很乐意接受: C:\ayane>type factorial.rkt #lang racket (p
我的源文件位于此文件夹中:c:\data\mycompany。我的所有源文件的第一行都包含以下内容:package mycompany;现在,我从 c:\data 文件夹中使用以下命令编译了所有内容:
这个问题在这里已经有了答案: #include all .cpp files into a single compilation unit? (6 个回答) The benefits / disadv
我对这个 JAVA RMI 项目真的很陌生。我只是想知道我可以使用什么编译器来编译我的JAVA源代码?以及如何做到这一点? 我正在尝试编译来自 http://www.eg.bucknell.edu/~
我想使用 Subversion 并仅 check out 源文件(例如:仅 check out .c 、 .cpp 和 .h 文件)。这可能吗 ?如果是这样,我该怎么做? 我正在尝试从以下位置获取 w
有没有办法使用指向唯一头文件的不同配置(或不同方法)来设置单个项目。 我想创建一个包含两个头文件的 C 项目(例如 header1.h 和 header2.h)。在我的 .c 源文件中,我定义了两个配
我是一名优秀的程序员,十分优秀!