这是我的代码:
#include "color.h"
int main ( int argc , char **argv )
{
Highlight h;
return 0;
}
#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
#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:警告:'colors'已初始化并声明为'extern' color.cpp:13:1:警告:扩展初始化程序列表仅适用于-std = c ++ 0x或-std = gnu ++ 0x
color.cpp:13:1:警告:扩展初始化列表仅适用于-std = c ++ 0x或--std = gnu ++ 0x
我对colorPattern_t{}
初始化方法有什么建议吗?我希望将它们安装在我的代码中,而不使用-std=c++0x
来修复症状。
答案 0 :(得分:2)
在您的示例中,我没有看到color.cpp
访问colors
之外的任何内容,因此没有理由在其定义中使用extern
。
如果其他文件可以访问此全局数据,则在colors.h
中声明存在colors
数据结构:
extern colorPatterns_t colors[];
然后在color.cpp
中删除extern
并在您正在进行初始化。 extern
告诉编译器该变量在其他地方被声明(并可能被初始化)。
如果您从colors
之外的其他文件访问color.cpp
,则sizeof colors
将无效,因此您必须以其他方式发出信号。定义颜色数
/* in colors.h */
#define N_COLORS 2
extern colorPatterns_t colors[];
/* in color.cpp */
colorPatterns_t colors[N_COLORS] = { ...
或者您可以在最后一个广告位中添加标记(例如-1
或其他一些明显的非法值)。
当然,全局变量通常是邪恶的,您应该在color.c
中提供一组例程/方法来访问/操作颜色结构,以便您可以自由地更改或更新其实现而不会影响你的其余代码库。
答案 1 :(得分:0)
只需删除extern
关键字即可。非static
全局变量本质上是extern
。它应该工作正常。
编辑:如果多个文件中包含color.h
,则可能会出现链接器错误。因此,将数组定义保留在.cpp
文件中并将extern <array>
语法放在.h
文件中是一种很好的做法。