全局常量字符指针数组在C++

Global const char pointer array in C++

本文关键字:C++ 数组 指针 常量 字符 全局      更新时间:2023-10-16

我在头文件中定义了一个常量字符指针数组。数组包含多个字符串。现在我必须在特定索引处找到一个字符串。我不知道我应该如何从另一个文件访问这个数组。请参阅我的代码:

普通.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 使用。