C++ 如何在C++;?

C++ 如何在C++;?,c++,arrays,constants,C++,Arrays,Constants,以下是我所拥有(不工作)的简化版本: 项目h: ... const string c_strExample1 = "ex1"; const string c_strExample2 = "ex2"; const string c_astrExamples[] = {c_strExample1, c_strExample2}; ... extern const string c_strExample1; extern const string c_strExample2; extern cons

以下是我所拥有(不工作)的简化版本:

项目h:

...
const string c_strExample1 = "ex1";
const string c_strExample2 = "ex2";
const string c_astrExamples[] = {c_strExample1, c_strExample2};
...
extern const string c_strExample1;
extern const string c_strExample2;
extern const string c_astrExamples[];
prog.cpp:

...
int main()
{
    int nLength = c_astrExamples.length();
    for (int i = 0; i < nLength; i++)
        cout << c_astrExamples[i] << "\n";
    return 0;
}
...
。。。
int main()
{
int nLength=c_astrExamples.length();
对于(int i=0;iCUT< P> CasAtestRxAMPLE是数组,没有“长度()”方法。C++中的数组< < /P> < P>数组中没有成员函数。如果你想要一个对象,你应该使用一个集合,比如<代码>矢量< /代码>,或者计算这样的长度:

int nLength = sizeof(c_astrExamples)/sizeof(c_astrExamples[0]);

<> > C++中的数组是从C继承的,这不是面向对象的,所以它们不是对象,也没有成员函数。(在它们中,它们的行为类似于代码> INT/CODE >,<代码>浮点和其他内置类型)。衰减为指向第一个元素的指针,并且没有留下大小信息

通常的建议是使用
std::vector
,这是一个动态调整大小的数组。但是,如果在编译时已知数组大小,并且需要一个常量,则(<代码> Boo::数组< /代码>,如果编译器支持Tr1标准扩展,也可作为代码> STD::Tr1::Standard < /Cord>,成为 STD::在C++标准的下一个版本中,数组是您想要的。

编辑1:

一个安全的方法来获取C++中数组的长度,它包含模板、函数指针以及宏混合到一起的难以置信组合:

template <typename T, std::size_t N>
char (&array_size_helper(T (&)[N]))[N];

#define ARRAY_SIZE(Array_) (sizeof( array_size_helper(Array_) ))

是足够的(而且更容易阅读和理解)。C++中的

< P>不是对象,也没有方法。如果需要得到数组的长度,可以使用下面的宏< /P>
#define COUNTOF( array ) ( sizeof( array )/sizeof( array[0] ) )
int nLength = COUNTOF(c_astrExamples);

另外,注意头文件中的初始化。您可能会冒犯链接器。
你应该:

项目h:

...
const string c_strExample1 = "ex1";
const string c_strExample2 = "ex2";
const string c_astrExamples[] = {c_strExample1, c_strExample2};
...
extern const string c_strExample1;
extern const string c_strExample2;
extern const string c_astrExamples[];
仅使用字符串而不是数组:

#include <string>
#include <vector>
using namespace std;

const string c_strExample1 = "ex1";
const string c_strExample2 = "ex2";
vector<string> c_astrExamples;
c_astrExamples.push_back(c_strExample1);
c_astrExamples.push_back(c_strExample2);

int main()
{
    int nLength = c_astrExamples.size();
#包括
#包括
使用名称空间std;
常量字符串c_strExample1=“ex1”;
常量字符串c_strExample2=“ex2”;
向量c_;
c_.向后推(c_街示例1);
c_.向后推(c_街示例2);
int main()
{
int nLength=c_astrExamples.size();

@Grumdrig:你需要开始一个新句子:“…vector.如果你…”@quamrana-Grumdrig的句子对我来说解析正确。“如果你想布拉赫,你应该使用X,否则就这样做。”完美的语法结构。我还想提醒提问者,他在使用sizeof()时要小心。它经常让新手感到困惑,因为它不会告诉您编译器不知道的任何内容的大小,例如动态分配的内存,或作为参数传递给函数的内容。向量的问题是,问题直接涉及常量数组,而构造常量向量并不简单(在C++0x中更容易实现)选项包括创建数组常量并将其用作迭代器,或在初始化位置调用的函数中创建值。关于数组中元素数的计算:有其他解决方案,请显式搜索。虽然最初难以读取,但有模板版本和如果您尝试在非数组元素(作为指针)上调用它,则会适得其反。一个简单的模板化版本是:
模板内联std::size\u t array\u size(t(&a)[N]){return N;}
,对我来说,这比所提供的解决方案更可取(如果使用指针而不是数组,则很难失败)对于
const
对象,我不认为这是真的。@sbi:你说得很对,但如果
const
被删除,它不会有什么坏处。@quamrana:有时确实会有坏处,但要小心:在
结构X{static const int k=5;};
中,
X::k
可以用作编译时常量(例如,用于指定堆栈数组的大小)。如果它是在类的cpp文件中初始化的,这是不可能的。此外,将全局常量更改为全局变量应该引起一些注意。Paul的代码在链接时失败可能算是一个优势。感谢关于衰减为指向第一个元素的指针的附加说明。That解释了我得到的一些行为,这让我相信我有一个指向数组的指针模板调用将提供编译时常量。还有其他更简单、更易于读取的语法是安全的,但会产生运行时值:
template inline std::size_t array_size(t(&)[N]){return N;}
是安全的,在大多数编译器中,将在编译时内联并转换为常量(无运行时开销)但它不是元编程中可以使用的“编译时常量”。请注意,此宏的缺点是它使用
array
作为指针进行编译。(请尝试
sizeof(0[array])
,它使用指针失败,但可以使用数组。)@sbi:应该如何使用
0[pointer]<代码>失败?这是C++中的一个有效的操作。(和g++ 4所考虑的一样)