C++ 在头文件中设置常量char*?

C++ 在头文件中设置常量char*?,c++,c,C++,C,如果我想在头文件中设置一个私有的常量字符数组,你怎么能做到呢?编译器似乎不喜欢它。。这是我试过的 static const char *foo = "SomeCharArray"; 按以下方式使用extern关键字 // myfile.h extern const char* foo; // myfile.cpp const char* foo = "SomeCharArray"; 按以下方式使用extern关键字 // myfile.h extern const char* foo;

如果我想在头文件中设置一个私有的常量字符数组,你怎么能做到呢?编译器似乎不喜欢它。。这是我试过的

static const char *foo = "SomeCharArray";

按以下方式使用
extern
关键字

// myfile.h
extern const char* foo;

// myfile.cpp
const char* foo = "SomeCharArray";

按以下方式使用
extern
关键字

// myfile.h
extern const char* foo;

// myfile.cpp
const char* foo = "SomeCharArray";
文件.h:

extern const char* foo;
#define FOO_DATA "SomeCharDATA"
文件c:

const char *foo = FOO_DATA;
文件.h:

extern const char* foo;
#define FOO_DATA "SomeCharDATA"
文件c:

const char *foo = FOO_DATA;

以下代码编译得很好:

康斯蒂·h:

static const char *foo = "SomeCharArray";
康斯蒂c:

#include <stdio.h>
#include "consty.h"
int main()
{
    printf ("Hi %s\n", foo);
    return 0;
}
#包括
#包括“consty.h”
int main()
{
printf(“高%s\n”,foo);
返回0;
}

请注意,任何包含
consty.h
的文件都将获得自己的foo副本。其他人描述了与
extern

共享全局变量的正确方法。以下代码编译得很好:

康斯蒂·h:

static const char *foo = "SomeCharArray";
康斯蒂c:

#include <stdio.h>
#include "consty.h"
int main()
{
    printf ("Hi %s\n", foo);
    return 0;
}
#包括
#包括“consty.h”
int main()
{
printf(“高%s\n”,foo);
返回0;
}
请注意,任何包含
consty.h
的文件都将获得自己的foo副本。其他人描述了与
extern

共享全局变量的正确方法,因为:

static const char *foo = "SomeCharArray";
是一个完全有效的C(即使是在头文件中),我想你应该问问自己为什么要在头文件中使用这个

如果需要将变量范围限制在.c文件中,只需将声明放在该文件中即可。如果您发现自己需要在两个.c文件之间共享私有数据,则可能没有以最合适的方式在文件之间拆分函数和数据。

鉴于以下情况:

static const char *foo = "SomeCharArray";
是一个完全有效的C(即使是在头文件中),我想你应该问问自己为什么要在头文件中使用这个



如果需要将变量范围限制在.c文件中,只需将声明放在该文件中即可。如果你发现你需要在两个C文件之间共享私有数据,你可能没有以最合适的方式将文件和数据分割到你的文件中。

这是完全有效的。C,编译器说什么,你认为它不喜欢它?”Billy ONeal:我很好奇为什么你删除了C++标签。这个问题同样适用于C和C++。@ NMICELS:它是实现文件中的有效C;不在标题中。您使用的编译器是什么?我在gcc中测试了以下内容,它没有抱怨。静态常量char foo[]=“一些字符串”;静态常量char*bar=“另一个字符串”@PigBen:因为在C++中,它将是代码>静态STD::String Fo(“SoaCARARAMARTER”);<代码>这是非常有效的。编译器说,你认为它不喜欢它?”Billy ONeal:我很好奇为什么你删除了C++标签。这个问题同样适用于C和C++。@ NMICELS:它是实现文件中的有效C;不在标题中。您使用的编译器是什么?我在gcc中测试了以下内容,它没有抱怨。静态常量char foo[]=“一些字符串”;静态常量char*bar=“另一个字符串”@PigBen:因为在C++中,它将是代码>静态STD::String Fo(“SoaCARARAMARTER”);<代码>如果你要这样做,你最好直接使用FOO_数据。不是真的,@Billy。如果直接使用
FOO\u DATA
,则无法更改其值,而如果使用
FOO
,则可以使
FOO
指向其他字符。@Billy你是对的,但并非所有链接器都会搜索相同的字符串并将其删除。问题是,这两种情况都是最糟糕的。宏会污染其他翻译单元,并且必须处理链接的复杂性。无论在何处使用宏,还是根本不使用宏(并在仅定义了
foo
的翻译单元中定义它),如果要这样做,您最好直接使用foo_数据。不完全是这样,@Billy。如果直接使用
FOO\u DATA
,则无法更改其值,而如果使用
FOO
,则可以使
FOO
指向其他字符。@Billy你是对的,但并非所有链接器都会搜索相同的字符串并将其删除。问题是,这两种情况都是最糟糕的。宏会污染其他翻译单元,并且必须处理链接的复杂性。可以在任何地方使用宏,也可以根本不使用宏(并在仅定义了
foo
的翻译单元中定义宏)