Ошибка компилятора c ++ не была объявлена ​​в этой области

Я получаю странную ошибку компилятора при попытке скомпилировать клиентскую программу c ++ UDP.

g ++ -o клиент Udp.cpp ClientMain.c -I. -lpthread

В файле из ClientMain.c: 1: 0:

Udp.h: В деструкторе «CUdpMsg :: ~ CUdpMsg ()»:

Udp.h: 103: 43: ошибка: "бесплатно" не было объявлено в этой области

Udp.h: в функции-члене «void CUdpMsg :: Add (in_addr_t, const void *, size_t)»:

Udp.h: 109: 34: ошибка: "malloc" не был объявлен в этой области видимости

Udp.h: 109: 41: ошибка: memcpy не был объявлен в этой области

ClientMain.c: в функции «int main (int, char **)»:

ClientMain.c: 28: 57: ошибка: memcpy не был объявлен в этой области

ClientMain.c: 29: 61: ошибка: «printf» не был объявлен в этой области

ClientMain.c: 30: 17: ошибка: «stdout» не был объявлен в этой области

ClientMain.c: 30: 23: ошибка: "fflush" не был объявлен в этой области

ClientMain.c: 34: 68: ошибка: «printf» не был объявлен в этой области

ClientMain.c: 35: 17: ошибка: «stdout» не был объявлен в этой области

ClientMain.c: 35: 23: ошибка: "fflush" не был объявлен в этой области

ClientMain.c: 37: 30: ошибка: «usleep» не был объявлен в этой области

У меня в начале моего файла cpp объявлено следующее.

#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <ifaddrs.h>
#include <net/if.h>
#include <cstdlib> 
#include <string>
#include <stdlib.h>
#include <cstring>

#include <errno.h>

такие функции, как 'memcpy', должны быть объявлены в string.h ... У меня он (а также строка и cstring) все объявлены, и я все еще получаю эти ошибки компилятора. Кто-нибудь знает, почему это происходит? Спасибо.


person Mike    schedule 19.07.2011    source источник
comment
Вы говорите, что они включены в ваш файл cpp, но ошибки находятся в ClientMain.c (примечание .c, а не .cpp)?   -  person Georg Fritzsche    schedule 19.07.2011
comment
Я думаю, вам нужно включить некоторые из этих файлов в UDP.h   -  person Djole    schedule 19.07.2011
comment
вы указываете пространство имен std для вызовов этой функции   -  person triclosan    schedule 19.07.2011
comment
@triclosan: вам не нужно указывать std::malloc, если вы включаете заголовки C (т.е. заголовки .h)   -  person MSalters    schedule 19.07.2011
comment
@MSalters: согласен. но это не лучшая практика, включая <stdlib.h> и <cstdlib>.   -  person triclosan    schedule 19.07.2011


Ответы (4)


Если у вас несколько файлов, вам нужно включить соответствующие включения в каждый файл. Также, может быть, его нет в пространстве имен?

person dchhetri    schedule 19.07.2011

Ваш Udp.h файл также должен включать необходимые системные заголовки. Кроме того, поскольку вы используете cstring и cstdlib в качестве включений, вам необходимо квалифицировать все функции библиотеки C с помощью std::, поскольку они не автоматически импортируются в глобальное пространство имен этими заголовками.

person Mark B    schedule 19.07.2011
comment
Или они должны быть включены перед Udp.h во все единицы перевода (хотя это было бы плохой практикой). - person Björn Pollex; 19.07.2011

Mark B охватывает все точные причины вашей ошибки. Я просто хочу добавить, что вы должны стараться не смешивать две разновидности заголовков C в одном файле cpp (#include <cHEADER> vs #include <HEADER.h>).

Разнообразие #include <cHEADER> переносит все включенные объявления в пространство имен std ::. В #include <HEADER.h> файлах объявлений нет. Раздражает поддержание кода, когда вам нужно std::malloc(), но ::strncpy(). Выберите один подход для каждого файла или, что более предпочтительно, один подход для всего вашего проекта.

В качестве отдельной проблемы вы столкнулись с ситуацией, когда заголовок сам по себе не включает в себя все, что ему нужно. Это может раздражать при отладке, потому что ошибки могут появляться или исчезать в зависимости от порядка включения.

Если вы создаете пару заголовок / cpp, всегда делайте совпадающий заголовок первым включаемым в файл cpp, это гарантирует, что заголовок будет полным и может стоять сам по себе. Если вы создаете автономный заголовок, который не требует реализации, вы все равно можете создать пустой .cpp для проверки заголовка на полноту включения или просто запустить заголовок через ваш компилятор самостоятельно. Выполнение этого с каждым создаваемым заголовком предотвратит головную боль, подобную текущей.

person Greg Howell    schedule 19.07.2011

Более чистое решение, вероятно, состоит в том, чтобы переместить реализацию CUdpMsg::~CUdpMsg с udp.h на udp.cpp, а также любую функцию, которая выдает такие ошибки. Определяйте функции в заголовках только в том случае, если они действительно простые (например, геттеры).

person MSalters    schedule 19.07.2011