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

时间:2011-06-29 09:36:22

标签: c++

这是我的代码:

的main.cpp

#include "color.h"

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

color.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:警告:'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来修复症状。

2 个答案:

答案 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文件中是一种很好的做法。