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

时间:2016-09-04 07:09:04

标签: c++ string tooltip c-preprocessor mingw32

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

//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();

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

我愿意接受有关数据放置位置的建议(我会排除文件/数据库,但由于需要更多编码和数据,这些数据很少需要更新,而且很容易被误用,例如文件可以更改。)

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

我想,阵列/ deques /结构都会增加重复。

我对预处理器命令/宏的使用知识和能力目前非常有限。我尝试使用'#defines'失败了。

我认为,或许是错误的,预处理器命令可能会限制可移植性(不是真正的问题)。但是,我怀疑也许预处理器可以提高编码效率。

我想要实现的目标摘要是

“将文本字符串周围的clutter减少到最小。主要是他们的定义,但也考虑后续使用。”

1 个答案:

答案 0 :(得分:1)

我会把它放在一个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; }
}

我不会将常量放入标题中 - 您首先将单个编译单元中的常数相乘,并且依靠链接器发现相同的字符串感到不舒服...

修改 考虑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);

只要全局只包含一个头文件(包含在一个源文件中,而不包含在其他头文件中),将tooltip.cpp文件中的定义移动到头文件并删除源文件。不过,我认为这种方法不安全,因为一旦这一事实发生变化,这可能会导致链接器出现问题。正如我提议的那样保持标题和源文件分开将防止现在和将来出现问题。

此外,它使编译时的语言交换变得容易,因为我们可以简单地做到:

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
# ...