gpt4 book ai didi

c++ - 外部常量指针的常量正确性

转载 作者:行者123 更新时间:2023-11-30 01:46:12 25 4
gpt4 key购买 nike

我正在尝试定义我可以在 cpp 文件中使用的常量字符串,这样既不能修改数据,也不能修改指针。链接器提示如下:

main.obj : error LNK2001: unresolved external symbol "char const * const g_someString"

示例代码:

//constants.h
extern const char * const g_someString;

//constants.cpp
const char * const g_someString = "Hello";

// main.cpp
int main()
{
strcmp(g_someString, "Hello");
}

不过,当 const char * const 被替换为 const char * 时,这不会发生。编译器 (MSVC 2015) 是否优化了 constants.cpp 中的 g_someString 定义?

最佳答案

之前

const char * const g_someString = "Hello";

您需要将其声明为 extern(例如通过包含 header ),因为 const 命名空间级变量默认具有内部链接。


也就是说,您可以只在 header 中定义字符串。单独的编译使您能够在不重建大量文件的情况下修改字符串,但除此之外,恕我直言,这是过早的优化。


要使 header 中的字符串定义正式对于内联函数是安全的,如果需要的话,您需要字符串(或至少是指针)具有extern 链接。一种方法是在单一定义规则中利用模板的特殊豁免。例如。像这样:

// Perhaps best generated by some code generation facility:
template< class Dummy >
struct Strings_
{
static char const* const some_string;
static char const* const some_other_string;
};

template< class Dummy >
char const* const Strings_<Dummy>::some_string = "Blah!";

template< class Dummy >
char const* const Strings_<Dummy>::some_string = "Oh, well.";

using Strings = Strings_<void>;

然后用法类似

inline void foo() { cout << Strings::some_string << endl; }

此处 Strings::some_string 指针在所有翻译单元中都是相同的。

另一种方法是在 inline 函数中定义字符串。然后你可以使用例如一个枚举来命名它们。

enum String_id { some_string, some_other_string };

inline
auto strings( String_id const id )
-> char const*
{
switch( id )
{
case some_string: return "Blah!";
case some_other_string: return "Oh, well.";
}
assert( false ); // Should never get here.
}

用法类似

inline void foo() { cout << strings( some_string ) << endl; }

inline 函数具有extern 链接,因此在所有翻译单元中都是相同的。

关于c++ - 外部常量指针的常量正确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33558358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com