gpt4 book ai didi

c++ - 如何使用 extern 关键字正确初始化 struct[int]

转载 作者:行者123 更新时间:2023-11-30 04:33:44 25 4
gpt4 key购买 nike

这是我的代码:

main.cpp

#include "color.h"

int main ( int argc , char **argv )
{
Highlight h;
return 0;
}

颜色.h

#ifndef HIGH_H
#define HIGH_H
#include <iostream>

using namespace std;

struct colorPattern_t
{
int c1 , c2;

colorPattern_t ( int a , int b )
{
c1 = a; c2 = b;

cout << "colorPattern_t() with " << c1 << " , " << c2 << endl;
}

void say()
{
cout << "say() from colorPattern_t" << endl;
};
};

class Highlight
{
public:
Highlight ();
};

#endif

现在color.cpp

#include "color.h"

extern colorPattern_t colors[2] =
{
{
1,
2
} ,
{
4,
5
}
};

Highlight::Highlight()
{
for ( int i = 0 ; i < sizeof(colors) / sizeof(colorPattern_t) ; i ++ )
{
colors[i].say();
}
};

编译时:

g++ main.cpp color.cpp -o main

我明白了:

color.cpp:3:31: warning: ‘colors’ initialized and declared ‘extern’
color.cpp:13:1: warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x
color.cpp:13:1: warning: extended initializer lists only available with -std=c++0x or - std=gnu++0x

我对我的 colorPattern_t{} 初始化方法有什么建议吗?我希望将它们安装在我的代码中而不使用 -std=c++0x 来修复症状。

最佳答案

在你的例子中,我没有看到 color.cpp 之外的任何东西访问 colors,所以没有理由让 extern 关于它的定义。

如果其他文件要访问此全局数据,则在 colors.h 中声明存在一个 colors 数据结构:

extern colorPatterns_t colors[];

然后在您的 color.cpp 中删除 extern 并按照您的操作对其进行初始化。 extern 告诉编译器该变量已在其他地方声明(并可能已初始化)。

如果您从 color.cpp 之外的另一个文件访问 colorssizeof colors 将不起作用,因此您将必须以其他方式表明其大小。要么定义颜色个数

 /* in colors.h */
#define N_COLORS 2
extern colorPatterns_t colors[];

/* in color.cpp */
colorPatterns_t colors[N_COLORS] = { ...

或者您可以在最后一个插槽中放置一个标记(例如 -1 或其他一些明显的非法值)。

当然,全局变量通常是邪恶的,您应该只在 color.c 中提供一组例程/方法来访问/操作颜色结构,以便您可以自由更改或在不影响其余代码库的情况下更新其实现。

关于c++ - 如何使用 extern 关键字正确初始化 struct[int],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6518545/

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