【问题标题】:c++ where/how to correctly define static textC++ 在哪里/如何正确定义静态文本
【发布时间】:2016-03-23 16:18:24
【问题描述】:

我正在用 C++ 创建一个控制台程序。

我有像 "error wrong usage, usage is: program <parameter> <parameter2>""game over!" 这样的静态文本行

我最近有一个 C 项目,其中所有代码都必须放在一个 c 文件中。我刚刚做了很多这样的定义:

#define ERRUSAGE "Usage error: correct usage is ./bla - bla2 -etc"

在包含之后和函数预定义之前。

现在我正在开发一个允许有多个文件的 c++ 程序。我知道我会使用 .h 文件来定义某些东西,并使用 .cpp 文件来实现某些东西。

这里的方法是制作一个 staticTextOutput.h 并用

填充它
#ifndef BLABLA
#define BLABLA "sometext"
#endif

然后将它包含在我需要的地方?

这里的最佳做法是什么?

o/

编辑:

感谢您提醒我制作 const 而不是使用定义;这很重要。

为了完善我的问题:我还想知道文件结构应该是什么样子(因为 .h 文件传统上包含声明和 .cpp 文件定义)。

我知道这应该如何查找函数和类,因为它具有静态/常量成员,所以结构(例如作为答案发布的 Xaqq)会去哪里?

【问题讨论】:

  • 我认为您应该为此类消息创建单独的命名空间,并使用 const 字符串或其他东西,可能是它们的数组或向量。
  • 你可以使用constexpr代替定义,在C++11中更好。

标签: c++ c-preprocessor file-structure


【解决方案1】:

处理游戏中字符串(对话框等)的一种常用方法是将它们存储在您在运行时加载一次并存储在变量中的资产文件中。

通过这种方式,您可以避免重新编译所有内容来修复错字,您可以轻松使用多种语言等。

【讨论】:

  • 这里的最佳实践方法是什么我应该把它放在什么文件类型中?在 .h 或 .cpp 文件中? (如果我使用像他的答案中使用的 Xaqq 这样的结构)使用结构而不是将它们全部放在命名空间中的原因是什么?
  • 我不确定您的问题。您可以将字符串放在 txt 文件中并在运行时对其进行解析。
【解决方案2】:

由于这被标记为 C++,我建议尽可能远离宏。

如果你的编译器支持,我会使用constexpr 来定义那些静态文本。

struct Messages
{
 constexpr static const char * const blabla = "sometext";
};

然后你可以像这样使用它:

std::cout << Messages::blabla << std::endl;

【讨论】:

  • constexpr static const char * constconstexpr static const char * 相同
  • 定义的最大好处是,编译器可以连接字符串文字。 constexpr char* 不能。
  • 你可以用字符串代替
  • @DimChtz, std::strings 也不能被编译器连接。
  • @SergeyA 我很确定你可以连接constexpr char *。不过,它可能很丑陋,而且不是很直观。
【解决方案3】:

我使用字符数组:

static const char my_text[] = "Three little froggies, ready to jump.";

static const 允许编译器将文本放在只读部分中,因为只有一个实例,编译器可以直接访问它(无需复制到堆栈)。

数组表示法允许在编译时计算长度:

const unsigned int text_length = sizeof(my_text) - 1U;

1U 代表 nul 终止符。

【讨论】:

    【解决方案4】:

    我会在下面的文档顶部写下这个:

    const static std::string CErrorMessage = "Usage error: correct usage is ./bla - bla2 -etc";
    

    【讨论】:

    • 为什么std::string 的重量级很重,而简单的static const char* const 就可以解决问题?
    • 在 C++ 中我更喜欢std::strings。在 C 语言中,我更喜欢 char*
    • @Vinigas 在你真正需要的时候使用std::string
    • @Vinigas,为什么?为了偏好 X 而不是 Y,X 应该比 Y 有好处,这超过了 X 对 Y 的成本!这是工程方法。在这种情况下std::string 有什么好处?你知道它的成本吗?
    • 首先,string 使用和操作起来更加舒适。它们有修饰符,例如,inserterase。同样在我看来,您应该始终在 C++ OOP 中使用 std::string,因为 std::string 本身就是 OO。如果您的程序中有字符串和字符串常量,那么您就不会浪费时间将 char* 转换为 std::string。
    猜你喜欢
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    相关资源
    最近更新 更多