是否有更有效或更高效的方法来编写冗长的文本?

Are there more effective or efficient ways to code lengthy texts?

我有一个应用程序会有很多冗长的工具提示。例如,我有代码,只有一个这样的工具提示,如下所示:-

//Less SSA (ATi-SSA) (as coded in a header)
std::string GetLessSSA_tt() {
    std::string less_ssastr = "Less SSA = The amount after deducting the SSA from the ATI.";
    less_ssastr.append("\n\nAs such reducing the amount used for calculation purposes");
    //etc
    return less_ssastr;
}

 ......

//Coded at various places not within the header
std::string tooltip = GetLessSSA_tt();

我认为头文件可能是最适合分离数据和代码的地方,并且可以避免数据重复。

我乐于接受有关将数据放置在何处的建议(我会排除 file/database,但由于需要更多编码和拥有数据,这些数据很少需要更新、遥远且可能容易被误用,例如文件可能被更改)。

真正的问题是文本存储的实际编码。会有相当可观的数量。上面的例子是 simplified/minimalist 一个较小文本的例子。将至少有 27 个主题(术语解释),这相当于使用示例方法到 27 个函数,每个可能至少有 5 行文本。

我猜

Arrays/deques/structures 都会增加重复。

我对预处理器 commands/macros 的了解和使用能力目前非常有限。我所有使用“#defines”的尝试都失败了。

我相信,也许是错误的,预处理器命令可能会限制可移植性(这不是真正的问题)。但是,我怀疑预处理器也许可以进行更多 efficient/effective 编码。

我要实现的目标的总结是

"to reduce the clutter around the text strings to a minimum. Primarily their definition but also considering subsequent usage."

我会把它放在一个 C++ 文件中,应该使用简单的常量:

tooltip.h:

namespace Whatever
{
extern std::string const ToolTip1;
extern std::string const ToolTip2;
}

tooltip.cpp:

namespace Whatever
{
std::string const ToolTip1(
        "some lengthy tooltip\n"
        "with several lines"
        );
std::string const ToolTip2(
        "a shorter one"
        );
}

如果您更喜欢函数:

tooltip.h:

namespace Whatever
{
std::string const& toolTip1();
std::string const& toolTip2();
}

tooltip.cpp:

namespace Whatever
{
namespace
{
std::string const ToolTip1(
        "some lengthy tooltip\n"
        "with several lines"
        );
std::string const ToolTip2(
        "a shorter one"
        );
}

std::string const& toolTip1() { return ToolTip1; }
std::string const& toolTip2() { return ToolTip2; }
}

我不会将常量放入 header - 你首先在单个编译单元中乘以常量,依赖链接器发现相同的字符串我感到不舒服...

编辑: 考虑 MikeT 的评论和(拒绝)编辑:

tooltip.h:

namespace Whatever
{
extern char const* const ToolTip1;
extern char const* const ToolTip2;
}

tooltip.cpp:

namespace Whatever
{
char const* const ToolTip1 = "theToolTip";
char const* const ToolTip2 = "theToolTip";
}

用法:

// before:
// addToolTip(getToolTip1().c_str());
// now:
addToolTip(ToolTip1);

只要全局只有一个 header 文件包含(到一个源文件中,而不包含在其他 headers 中),就不会有问题将定义从 tooltip.cpp 文件移动到 header 文件并删除源文件。不过,我认为这是不安全的,因为一旦这一事实发生变化,这可能会导致链接器问题。按照我的建议将 header 和源文件分开可以防止现在和将来出现问题。

此外,它使得在编译时交换语言变得容易,我们可以简单地这样做:

gcc main.cpp, something.cpp, tooltip_en-GB.cpp -o theApplication # English translation
gcc main.cpp, something.cpp, tooltip_es-ES.cpp -o theApplication # Spanish translation
# ...