我似乎可能需要着手一些跨平台项目,而部分项目必须使用C或C++完成(尚未确定,因此问题在于两者)。一般而言,我将主要处理基于文本的内容和字符串。

该C/C++将具有可从更高级别的平台相关代码中调用的API。

我的问题是:建议使用什么类型的字符串来处理字符串,特别是在声明公共(public)接口(interface)时?有推荐的标准技术吗?有什么要避免的吗?

我几乎没有编写C或C++代码的经验,即使在Windows上也没有,因此根本没有像跨平台这样的东西。因此,我真正想要的是使我以正确的方式进行工作,并避免做一些愚蠢的事情,这些事情肯定会引起很多痛苦。

编辑1:提供更多有关预期用途的上下文。
该API将通过以下方式使用:

  • 通过NSString和 friend 在iPhone/iPad/Mac上使用ObjectiveC。该API可以静态链接,因此无需担心.so .dll问题。
  • 通过Android和其他Java平台上的JNI的Java
    从托管C#代码通过p/invoke调用
  • .NET;如果使用C++/CLI,则通过 native 静态链接。
  • 在这种情况下,有一些关于以某种方式/在某处使用lua的想法。不知道这是否对任何事情都有影响。
  • 最佳答案

    规则

  • 使用UTF格式存储字符串,而不是“代码页”或诸如此类(UTF-16可能更容易编辑:我完全忘记字节顺序问题; UTF-8可能是解决方法)。
  • 使用以空值结尾的字符串而不是计数的字符串,因为它们是大多数语言中最容易访问的字符串。但是要注意缓冲区溢出。
    于6年后更新:出于互操作性的原因,我建议使用此API(因为许多API已经使用了空终止,并且有多种表示计数字符串的方法),而不是从最佳设计的角度来看最好的API。今天,我可能会说前者不太重要,如果可以的话,建议使用计数字符串而不是以空终止的字符串。
  • 甚至不要尝试使用std::string之类的类来向/从用户传递字符串。升级您的编译器/库后,即使您自己的程序也可能会中断(因为它们的实现细节仅是:实现细节),更不用说非C++程序会遇到麻烦的事实。
    六年后更新:严格出于与其他语言之间的语言和ABI兼容性原因,而不是C++程序开发的一般建议。如果您要进行C++开发,跨平台或其他方式,请使用STL!即仅在您需要使用其他语言调用代码时才遵循此建议。
  • 避免为用户分配字符串,除非这确实给用户带来痛苦。取而代之的是,获取一个缓冲区并用数据填充它。这样,您不必强制用户使用特定功能来释放数据。 (这通常也具有性能上的优势,因为它允许用户在堆栈上分配小缓冲区。但是,如果这样做,提供了自己的函数来释放数据。您不能假设自己的malloc或可以使用newfree释放delete,但通常无法使用。)

  • 笔记:
    只是为了澄清一下,“让用户分配缓冲区”和“使用以NULL终止的字符串”不会互相冲突。您仍然需要从用户那里获取缓冲区长度,但是在终止字符串时要包括NULL。我的意思并不是说您应该创建类似于scanf("%s")的函数,这显然是不可行的危险-您仍然需要用户提供缓冲区长度。即执行Windows在这方面的几乎所有操作。

    关于c++ - 在跨平台C和C++ API中使用字符串的当前最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6832073/

    10-11 22:56
    查看更多