全局常量字符指针数组在C++
Global const char pointer array in C++
我在头文件中定义了一个常量字符指针数组。数组包含多个字符串。现在我必须在特定索引处找到一个字符串。我不知道我应该如何从另一个文件访问这个数组。请参阅我的代码:
普通.h
extern const char *lookup_str[] = {"test Str0", "test Str1", "test Str2", "test Str3"};
文件1.cpp
int ret = 3;
std::string r = lookup_str[ret];
我可以在所有 C 文件中使用这种方式吗?如果您可以看到任何替代方法,请告诉我。任何建议/帮助将不胜感激。提前谢谢你!
声明变量而不在 .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);
更新
C++98 lookup_str()
的实现将是:
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);
}
应避免在头文件中具有变量定义。相反,你可以有一个声明,它只是通知编译器一个符号,该符号可以在其他地方定义,并单独编译。
因此,您的标题应如下所示:
extern const char *lookup_str[]; // defined elsewhere
你应该把它添加到源(.c)文件中(不管哪一个,只要它链接到最终的可执行文件):
const char *lookup_str[] = { ... };
然后要使用它,只需包含上述标头,并像使用任何数组一样使用它。
由于您是在c++
中执行此操作,因此不要使用 c-strings
,以 c++ 方式执行此操作:
常见.cpp
std::array<std::string, 4> lookup_str = {"test Str0", "test Str1", "test Str2", "test Str3"};
普通.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");
下面是一个活生生的例子:
http://ideone.com/UFfIyV
更简洁的设计 IMO 是在由宏定义分隔的头文件中声明 extern 和定义
斯特德夫·
#ifdef STRING_INSTANCE_DEFINE
const char *lookup_str[] = {"test Str0", "test Str1", "test Str2", "test Str3"};
#else
extern const char *lookup_str[];
#endif
strdef.c
#define STRING_INSTANCE_DEFINE
#include <strdef.h>
所有其他文件
#include <strdef.h>
仅在 1 .c 文件中定义宏STRING_INSTANCE_DEFINE。使用该数组的所有其他文件可以只包含头文件,并且它们将作为 extern 使用。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '