/ / Struct im Header wirft einen unvollständigen Typ ab, wenn er lokal instanziiert wird, aber nicht, wenn er als Rückgabewert oder als Vektor gesetzt wird - c ++, vector, std

Das im Header enthaltene Struct löst einen unvollständigen Typ aus, wenn es lokal instanziiert wird, aber nicht, wenn es als Rückgabewert oder Vektor - c ++, vector, std

Ok, dieses Problem nervt mich seit einem Jahrwährend. Ich erstelle ein C ++ - Programm mit den Bibliotheken libpcap und libnet. Es scannt ein bestimmtes Land nach offenen Ports, indem es mit libnet synchronisiert und mit libpcap auf Antworten überprüft. Ich habe ein main.cpp Datei, die enthält network.h die die Quelldateien enthält, die zum Generieren der IPv4-Bereiche erforderlich sind (regex.cpp) und zum Scannen (libnet.cpp). Jetzt mein network.h Datei enthält die Definition für struct range Das sind nur zwei uint32_t"s repräsentiert die Anfangsadresse des Bereichs und das Ende.

network.h:

#ifndef NETWORK_H
#define NETWORK_H

#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>
#include <regex>
#include <fstream>
#include <libnet.h>
#include <pcap.h>
#include "src/regex.cpp"
#include "src/libnet.cpp"
#include "src/libpcap.cpp"

#define COLOR_GREEN "x1b[32m"
#define COLOR_RED "x1b[31m"
#define COLOR_RESET "x1b[0m"

#define SNAP_LEN 1518

typedef struct range {
uint32_t begin;
uint32_t end;
} range;
#endif

Und ich benutze es struct range als Rückgabetyp für getRangeByCountry

#include "../network.h"

std::vector<struct range> getRangeByCountry(const char* country){
std::vector<struct range> ranges;
try {
std::ifstream f("csv/geoip.csv");
std::regex re(""\d+.\d+.\d+.\d+","\d+.\d+.\d+.\d+","(\d+)","(\d+)","\w$
while (1){
std::string line;
std::getline(f, line);
std::smatch m;
if(line == ""){break;}
std::regex_match(line, m, re);
if (m[3] == country){
struct range r;
r.begin = std::stoul(std::string(m[1]), NULL, 0);
r.end = std::stoul(std::string(m[2]), NULL, 0);
ranges.push_back(r);
}
}
} catch (...){return ranges;}
return std::move(ranges);
}

Aber wenn ich kompiliere bekomme ich diesen Fehler:

src/regex.cpp: In function ‘std::vector<range> getRangeByCountry(const
char*)’:
src/regex.cpp:15:17: error: aggregate ‘range r’ has incomplete type and
cannot be defined
struct range r;

Warum gibt der Compiler keinen Fehler aus, wenn ich einen Vektor von deklariere? struct range örtlich? Oder wenn ich den gleichen Rückgabetyp einstelle? Wenn ich die Struktur in derselben Datei definiere wie getRangebyCountry () es wird fehlerfrei kompiliert. Ist das ein Problem mit meinem g ++ Parameter? Hier sind sie nur für den Fall: g++ main.cpp -lpcap -lnet --std=c++11

Antworten:

0 für die Antwort № 1

Problem behoben. @Walter und @IgorTandetnik hatten recht. Im Netzwerk Ich habe eine Definition für getRangeByCountry () und entfernte die .cpp beinhaltet wie folgt:

#ifndef _NETWORK_H
#define _NETWORK_H

#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>
#include <regex>
#include <fstream>
#include <libnet.h>
#include <pcap.h>

#define COLOR_GREEN "x1b[32m"
#define COLOR_RED "x1b[31m"
#define COLOR_RESET "x1b[0m"

#define SNAP_LEN 1518

std::vector<struct range> getRangeByCountry(const char*);

typedef struct range {
uint32_t begin;
uint32_t end;
} range;

Dann habe ich kompiliert regex.cpp getrennt und in meine Zusammenstellung von main.cpp so: g++ main.cpp src/regex.o

Aber ich bin immer noch sehr wackelig mit dem Konzept. Wenn ich andere cpp-Quelldateien einbeziehen möchte, muss ich sie separat kompilieren und dann ihre Definition in eine Header-Datei und ihre tatsächliche Definition in eine .o-Datei einfügen, wenn ich kompiliere main.cpp?