c ++ extern字符串数组不可见

时间:2016-10-20 11:49:05

标签: c++

我是C ++开发的新手,因为我在网上学习外部变量 - 我尝试将字符串变量及其工作正常。但我必须使用字符串变量,因为它不起作用。请看如下。

globals.h

#include <iostream>

using namespace std;

#ifndef SIMULATIONFILEPARSER_GLOBALS_H
#define SIMULATIONFILEPARSER_GLOBALS_H
//sequence of files to be execute
extern string ipFiles[];
#endif //SIMULATIONFILEPARSER_GLOBALS_H

globals.cpp

#include "../headers/globals.h"
//sequence of files to be execute
string ipFiles[] = {"in.relaxSubstrate", "in.relaxFluid"};

的main.cpp

#include <iostream>
#include "Source/headers/globals.h"

int main() {
    for (string &ipFileName :ipFiles) {
        std::cout << ipFileName << std::endl;
    }
    return 0;
}

当我尝试运行此项目时,它会出现以下错误

C:\Users\king\ClionProjects\SimulationFileParser\main.cpp: In function 'int main()':
C:\Users\king\ClionProjects\SimulationFileParser\main.cpp:5:30: error: range-based 'for' expression of type 'std::__cxx11::basic_string<char> []' has incomplete type
     for (string &ipFileName :ipFiles) {
                              ^
CMakeFiles\SimulationFileParser.dir\build.make:61: recipe for target 'CMakeFiles/SimulationFileParser.dir/main.cpp.obj' failed
mingw32-make.exe[3]: *** [CMakeFiles/SimulationFileParser.dir/main.cpp.obj] Error 1
mingw32-make.exe[3]: *** Waiting for unfinished jobs....
mingw32-make.exe[2]: *** [CMakeFiles/SimulationFileParser.dir/all] Error 2
CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/SimulationFileParser.dir/all' failed
mingw32-make.exe[1]: *** [CMakeFiles/SimulationFileParser.dir/rule] Error 2
CMakeFiles\Makefile2:78: recipe for target 'CMakeFiles/SimulationFileParser.dir/rule' failed
mingw32-make.exe: *** [SimulationFileParser] Error 2
Makefile:117: recipe for target 'SimulationFileParser' failed

2 个答案:

答案 0 :(得分:0)

此循环不知道数组的大小。

for (string &ipFileName :ipFiles)

global.h中的更改

extern string ipFiles[2];

global.cpp中的更改

string ipFiles[2] = {"in.relaxSubstrate", "in.relaxFluid"};

在此之后,您的代码应该正确编译。

答案 1 :(得分:0)

编译器并没有抱怨一个不可见的符号。它告诉你,类型不完整:

  

基于范围&#39; for&#39;表达类型&#39; std :: __ cxx11 :: basic_string []&#39; 类型不完整

在编译器知道数组的大小之前,它无法编译基于范围的for循环。要更改此设置,您需要声明一个完整的类型。这可能是一个具有明确大小的数组,或者 - 这是推荐的解决方案 - 标准容器 1

<强> globals.h

#pragma once

#include <string>
#include <vector>

extern std::vector<std::string> ipFiles;

<强> globals.cpp

std::vector<std::string> ipFiles{"in.relaxSubstrate", "in.relaxFluid"};

您不必更改 main.cpp 。但是如果你想让它变得有趣,你可以使用auto以及锻炼const正确性:

int main() {
    for (const auto& ipFileName : ipFiles) {
        std::cout << ipFileName << std::endl;
    }
    return 0;
}

<小时/> 1 在编译时不需要知道标准容器的大小。所有编译器需求都是受控序列的begin()end()的(前向)迭代器。另一方面,数组不提供这些作为成员函数,并且编译器需要生成它们。它需要知道大小以生成等效的end()