我在头文件中定义了一个const char指针数组。数组包含多个字符串。现在我必须在特定索引处找到一个字符串。我不知道应该如何从其他文件访问此数组。请看我的代码:
COMMON.H
extern const char *lookup_str[] = {"test Str0", "test Str1", "test Str2", "test Str3"};
file1.cpp
int ret = 3;
std::string r = lookup_str[ret];
我可以在所有C文件中使用这种方式吗?如果您能看到任何替代方法,请告诉我。任何建议/帮助非常感谢。提前谢谢!
答案 0 :(得分:1)
声明变量而不在.h文件中初始化它:
extern const char *lookup_str[];
在一个源文件中初始化它。
const char *lookup_str[] = {"test Str0", "test Str1", "test Str2", "test Str3"};
要在.cpp文件中使用它,请使用:
#include "common.h"
...
int ret = 3;
std::string r = lookup_str[ret];
更好的替代方案IMO将为数据提供纯粹的功能接口。
.h文件:
std::string const& lookup_str(size_t index);
.cpp文件:
std::string const& lookup_str(size_t index)
{
static std::vector<std::string> str = {"test Str0", "test Str1", "test Str2", "test Str3"};
return str.at(index); // This will throw exception if index is not
// within bounds.
}
然后将其用作:
#include "common.h"
...
size_t ret = 3;
std::string r = lookup_str(ret);
<强>更新强>
lookup_str()
的C ++ 98实现将是:
std::string const& lookup_str(size_t index)
{
static std::vector<std::string> str;
if ( str.empty() )
{
str.push_back("test Str0");
str.push_back("test Str1");
str.push_back("test Str2");
str.push_back("test Str3");
}
return str.at(index);
}
答案 1 :(得分:0)
您应避免在头文件中使用变量定义。相反,你可以有一个声明,它只是告诉编译器一个符号,它可以在别处定义,并单独编译。
因此,您的标题应如下所示:
extern const char *lookup_str[]; // defined elsewhere
你应该将它添加到一个源(.c)文件(无论哪一个,只要它链接到最终的可执行文件):
const char *lookup_str[] = { ... };
然后使用它,只需包含上述标题,并像使用任何数组一样使用它。
答案 2 :(得分:0)
由于您是在c++
中执行此操作,请勿使用c-strings
执行此操作,请按c ++方式执行此操作:
common.cpp
std::array<std::string, 4> lookup_str = {"test Str0", "test Str1", "test Str2", "test Str3"};
COMMON.H
extern std::array<std::string, 4> lookup_str;
然后你可以用同样的方式使用它:
int ret = 3;
std::string r = lookup_str[ret];
或者以令人敬畏的c ++方式:
auto stringInArr = std::find(lookup_str.begin(), lookup_str.end(), "test Str3");
这是一个实例:
答案 3 :(得分:-1)
更清洁的设计IMO将在由宏定义分隔的头文件中声明extern和定义
<强> strdef.h 强>
#define STRING_INSTANCE_DEFINE
#include <strdef.h>
<强> strdef.c 强>
#include <strdef.h>
所有其他文件
grails.project.dependency.resolution = {
repositories {
grailsPlugins()
grailsHome()
mavenLocal()
grailsCentral()
mavenCentral()
}
}
请记住仅在1个 .c 文件中定义宏 STRING_INSTANCE_DEFINE 。使用该数组的所有其他文件可以只包含头文件,并且它们可以作为extern使用。