ошибка компилятора c ++ "не была объявлена ​​в этой области" - PullRequest
5 голосов
/ 19 июля 2011

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

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

В файле, включенном в ClientMain.c: 1: 0:

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

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

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), и я все еще получаю этиошибки компилятора.Кто-нибудь знает, почему это происходит?Спасибо.

Ответы [ 4 ]

6 голосов
/ 19 июля 2011

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

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

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

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

6 голосов
/ 19 июля 2011

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

5 голосов
/ 19 июля 2011

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

0 голосов
/ 19 июля 2011

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

...