2011-07-19 37 views
5

Tôi nhận được lỗi trình biên dịch kỳ lạ khi cố gắng biên dịch chương trình khách C++ UDP.lỗi trình biên dịch C++ "không được khai báo trong phạm vi này"

g++ -o client Udp.cpp ClientMain.c -I. -lpthread

In file included from ClientMain.c:1:0:

Udp.h: In destructor ‘CUdpMsg::~CUdpMsg()’:

Udp.h:103:43: error: ‘free’ was not declared in this scope

Udp.h: In member function ‘void CUdpMsg::Add(in_addr_t, const void*, size_t)’:

Udp.h:109:34: error: ‘malloc’ was not declared in this scope

Udp.h:109:41: error: ‘memcpy’ was not declared in this scope

ClientMain.c: In function ‘int main(int, char**)’:

ClientMain.c:28:57: error: ‘memcpy’ was not declared in this scope

ClientMain.c:29:61: error: ‘printf’ was not declared in this scope

ClientMain.c:30:17: error: ‘stdout’ was not declared in this scope

ClientMain.c:30:23: error: ‘fflush’ was not declared in this scope

ClientMain.c:34:68: error: ‘printf’ was not declared in this scope

ClientMain.c:35:17: error: ‘stdout’ was not declared in this scope

ClientMain.c:35:23: error: ‘fflush’ was not declared in this scope

ClientMain.c:37:30: error: ‘usleep’ was not declared in this scope

Tôi có thông báo sau ở đầu tệp cpp của tôi.

#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> 

các chức năng như 'memcpy' phải được khai báo bằng chuỗi. Có ai có một đầu mối tại sao điều này đang xảy ra? Cảm ơn.

+2

Bạn nói rằng bạn có các tệp đó bao gồm trong tệp * "cpp" * của bạn, nhưng các lỗi nằm trong 'ClientMain.c' (lưu ý' .c', không phải '.cpp')? –

+0

Tôi nghĩ rằng bạn cần bao gồm một số tệp đó trong 'UDP.h' – Djole

+0

là bạn chỉ định không gian tên std cho hàm này gọi là – triclosan

Trả lời

4

Nếu bạn có nhiều tệp, thì bạn cần có các tệp thích hợp trong mỗi tệp. Ngoài ra có lẽ nó không phải trong không gian tên?

5

Udp.h tệp cũng cần bao gồm các tiêu đề hệ thống cần thiết. Ngoài ra, vì bạn sử dụng cstringcstdlib làm bao gồm, bạn sẽ cần phải đủ điều kiện tất cả các chức năng của thư viện C với std:: vì chúng không phải là được nhập tự động vào không gian tên chung.

+0

Hoặc họ phải được bao gồm trước khi 'Udp.h' trong tất cả các đơn vị dịch thuật (điều này sẽ là thực tế xấu). –

0

Một giải pháp sạch hơn có thể là di chuyển việc triển khai CUdpMsg::~CUdpMsg từ udp.h đến udp.cpp và tương tự như bất kỳ chức năng nào cung cấp cho bạn các lỗi như vậy. Chỉ xác định hàm trong tiêu đề nếu chúng thực sự đơn giản (ví dụ: getters).

5

Đánh dấu B bao gồm tất cả các nguyên nhân chính xác gây ra lỗi của bạn. Tôi chỉ muốn thêm rằng bạn nên cố gắng không pha trộn hai hương vị của các tiêu đề C trong một tệp cpp đơn lẻ (#include <cHEADER>#include <HEADER.h>).

Giống #include <cHEADER> mang tất cả các khai báo được bao gồm vào không gian tên std ::. Các tệp #include <HEADER.h> bao gồm các khai báo không. Thật khó chịu khi duy trì mã khi bạn cần std::malloc() nhưng ::strncpy(). Chọn một cách tiếp cận cho mỗi tệp hoặc, tốt hơn nữa là một cách tiếp cận cho toàn bộ dự án của bạn.

Là một vấn đề riêng biệt, bạn đã gặp phải tình huống trong đó tiêu đề không bao gồm mọi thứ cần thiết. Điều này có thể gây phiền toái cho việc gỡ lỗi vì các lỗi có thể xuất hiện hoặc biến mất tùy thuộc vào thứ tự bao gồm.

Nếu bạn tạo cặp tiêu đề/cpp, luôn đặt tiêu đề phù hợp bao gồm đầu tiên trong tệp cpp, điều này sẽ đảm bảo rằng tiêu đề hoàn thành và có thể tự đứng đầu. Nếu bạn tạo một tiêu đề độc lập không cần triển khai, bạn vẫn có thể tạo một tệp .cpp trống để kiểm tra tiêu đề để bao gồm đầy đủ hoặc chỉ chạy tiêu đề thông qua trình biên dịch của chính bạn. Làm điều này với mỗi tiêu đề bạn tạo sẽ ngăn chặn đau đầu như hiện tại của bạn.

Các vấn đề liên quan