Lỗi trình biên dịch: memset không được khai báo trong phạm vi này


100

Tôi đang cố gắng biên dịch chương trình C của mình trong Ubuntu 9.10 (gcc 4.4.1).

Tôi nhận được lỗi này:

Rect.cpp:344: error: memset was not declared in this scope

Nhưng vấn đề là tôi đã đưa vào tệp cpp của mình:

#include <stdio.h>
#include <stdlib.h>

Và chương trình tương tự cũng biên dịch tốt trong Ubuntu 8.04 (gcc 4.2.4).

Xin vui lòng cho tôi biết những gì tôi đang thiếu.


2
Có điều tôi vẫn không hiểu là tại sao nó biên dịch tốt trên các phiên bản cũ hơn của gcc & ubuntu chứ không phải trên các phiên bản mới hơn. Bất cứ ai có thể giải thích tại sao?
Dennis

2
@Dennis: có lẽ vì tiêu đề cần thiết <string.h>được #included gián tiếp thông qua một số #includetiêu đề d khác trong cấu hình gcc / Ubuntu cũ hơn của bạn.
Paul R

@Dennis Thêm -fpermissive vào các tùy chọn gcc cũng có thể hữu ích trong những trường hợp kỳ lạ đó, mặc dù đó chỉ là một cách giải quyết
emu

Câu trả lời:


172

Bạn nên bao gồm <string.h>(hoặc tương đương C ++ của nó, <cstring>).


135

Bất cứ khi nào bạn gặp sự cố như thế này, chỉ cần truy cập trang người đàn ông cho hàm được đề cập và nó sẽ cho bạn biết bạn đang thiếu tiêu đề nào, ví dụ:

$ man memset

MEMSET(3)                BSD Library Functions Manual                MEMSET(3)

NAME
     memset -- fill a byte string with a byte value

LIBRARY
     Standard C Library (libc, -lc)

SYNOPSIS
     #include <string.h>

     void *
     memset(void *b, int c, size_t len);

Lưu ý rằng đối với C ++, thông thường, bạn nên sử dụng các tiêu đề C ++ tương đương thích hợp, <cstring>/ <cstdio>/ <cstdlib>/ etc, hơn là <string.h>/ <stdio.h>/ <stdlib.h>/ etc của C.


37
Tuyệt quá! Bạn dạy chúng tôi cách câu cá thay vì cho chúng tôi một con cá, hãy giơ ngón tay cái lên!
lukmac
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.