如何修复变量声明和全局构造函数警告?

时间:2018-02-10 21:50:52

标签: c++ c++11

我正在阅读 C ++如何编程并试图玩到目前为止我学到的东西(哈!)并编写了这个程序。 (这是我自己的事情,不是书中的练习。)输出是我想要的,但我无法修复警告。

我在Game.h中对random内容的使用是基于我在本书中看到的内容。

如果我在main()中放置导致警告的行,则错误消失,但编译器会抛出致命错误,因为它不再能够访问变量engine。我明白了很多。

我感到沮丧,因为我以为我在学习C ++,但C ++ 11的东西似乎很快就过去了。

Game.h

#include <iostream>
#include <array>
#include <ctime>
#include <random>

std::default_random_engine engine( static_cast< unsigned int >( time(0) ) );
std::uniform_int_distribution< int > randomInt( 0, 23 );
void initPieces( std::array< int, 24 >& );
void showPieces( std::array< int, 24 > );

的main.cpp

#include "Game.h"

int main() {
  std::array< int, 24 > piecesPlayer1 = {};
  std::array< int, 24 > piecesPlayer2 = {};
  initPieces ( piecesPlayer1 );
  initPieces ( piecesPlayer2 );
}

void initPieces( std::array< int, 24 >& myPieces) {
  for ( unsigned int i = 0; i < 24; i += 3 ) {
    myPieces[ i ] = 1;
    myPieces[ i + 1 ] = 2;
    myPieces[ i + 2 ] = 3;
  }
  for ( unsigned int i = 0; i < 24; i++ ) {
    int s = randomInt( engine );
    std::swap ( myPieces[ i ], myPieces[ static_cast<unsigned int>( s ) ] );
  }
  showPieces ( myPieces );
}

void showPieces( std::array< int, 24 > myPieces) {
  for ( unsigned int i = 0; i < 24; i++ ) {
    std::cout << myPieces[ i ] << " ";
  }
  std::cout << std::endl;
}

编辑:我忘了包含警告。

rm -fr build/*
clang++ -std=c++11 -stdlib=libc++ -Weverything -Wno-c++98-compat src/main.cpp -o build/main -Isrc/
In file included from src/main.cpp:1:
src/Game.h:7:28: warning: no previous extern declaration for non-static variable 'engine' [-Wmissing-variable-declarations]
std::default_random_engine engine( static_cast< unsigned int >( time(0) ) );
                           ^
src/Game.h:7:28: warning: declaration requires a global constructor [-Wglobal-constructors]
std::default_random_engine engine( static_cast< unsigned int >( time(0) ) );
                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/Game.h:8:38: warning: no previous extern declaration for non-static variable 'randomInt' [-Wmissing-variable-declarations]
std::uniform_int_distribution< int > randomInt( 0, 23 );
                                     ^
src/Game.h:8:38: warning: declaration requires a global constructor [-Wglobal-constructors]
std::uniform_int_distribution< int > randomInt( 0, 23 );
                                     ^~~~~~~~~~~~~~~~~~
4 warnings generated.
./build/main
2 3 2 3 3 2 2 2 2 1 1 3 2 1 3 1 1 1 3 3 3 1 1 2
2 3 3 1 2 3 3 2 1 2 1 2 1 1 3 2 3 1 3 2 3 1 2 1

1 个答案:

答案 0 :(得分:1)

使用C ++ 17,你可以用inline装饰game.h:

#pragma once

#include <iostream>
#include <array>
#include <ctime>
#include <random>

inline std::default_random_engine engine(static_cast< unsigned int >(time(0)));
inline std::uniform_int_distribution< int > randomInt(0, 23);
void initPieces(std::array< int, 24 >&);
void showPieces(std::array< int, 24 >);

对于旧的C ++,将标题更改为:

#pragma once

#include <iostream>
#include <array>
#include <ctime>
#include <random>

extern std::default_random_engine engine;
extern std::uniform_int_distribution< int > randomInt;
void initPieces(std::array< int, 24 >&);
void showPieces(std::array< int, 24 >);

将定义放入main.cpp或其他一些编译单元,例如: game.cpp。

std::default_random_engine engine(static_cast< unsigned int >(time(0)));
std::uniform_int_distribution< int > randomInt(0, 23);