2012-09-19 58 views
12

Bây giờ tôi đang nói về định nghĩa kiểu mới của một lập trình viên sử dụng từ khóa typedef. Miễn là học sinh của tôi được sử dụng để loại size_t (ví dụ bằng cách sử dụng funciton length()), mà tôi đã phải yêu cầu họ một chút nỗ lực để chỉ "tin" nó là một loại nguyên, tôi nghĩ rằng nó sẽ là tuyệt vời để hiển thị cho họ biết nơi loại này được xác định.Ở đâu là C++ size_t được định nghĩa trong linux

Vì vậy, tôi đã thực hiện rất nhiều grep trong/usr/include trong một hộp ubuntu, và những gì tôi thấy là size_t là, lần lượt, một định nghĩa lại của size_type mà lần lượt là định nghĩa lại metadata_type, và đó là kết thúc trong thư mục này. Không tìm thấy cuối cùng "typedef unsigned int metadata_type;".

Trong/usr/src tôi đã tìm thấy anohter loại trước đó gọi là yy_size_t, ...

Nhưng, trong mọi trường hợp tôi đã không thể có được sự để kết thúc chuỗi.

Có ai biết nơi để tìm ra định nghĩa cuối cùng để kiểm tra xem đó là một int không dấu (hoặc tương tự) không? Tôi có thể bỏ lỡ một gói phát triển trong hộp của mình không? Trong trường hợp này, tại sao tôi có thể biên dịch chương trình bằng cách sử dụng loại size_t?

+0

Hãy thử grep đệ quy: "grep -r" – Brady

+0

bản sao có thể có của [std :: size_t vs size_t vs std :: ____ :: size_type] (http://stackoverflow.com/questions/8507851/stdsize-t- vs-size-t-vs-std-size-type) – trojanfoe

+0

@Brady: 'sudo apt-get cài đặt ack-grep' –

Trả lời

21

Bạn có thể cố gắng mở rộng tiêu chuẩn bao gồm các file với tiền xử lý C (cpp) bằng tay và kiểm tra đầu ra của rằng:

$ echo '#include <stdlib.h>' | cpp -I/usr/include - > stdlib-expanded.c 

Bạn sẽ thấy rằng đầu ra của cpp thậm chí bao gồm các dấu hiệu để chỉ ra từ đó các tập tin mã trong stdlib-expanded.c đã được bao gồm.

+2

+1 chỉ là 'echo' #include '| cpp -I/usr/include | grep size_t' cho 'typedef long unsigned int size_t;' là dòng đầu tiên – stijn

+0

cảm ơn sự giúp đỡ của bạn –

+0

echo '#include ' | cpp -I/usr/include | grep size_t DID THE TRICK. CẢM ƠN! – user2548100

3

Khi người khác viết, bạn có thể tìm thấy nó nếu bạn tìm kiếm tất cả các tệp bao gồm. Tuy nhiên thực tế rằng đây là cách hầu hết các triển khai hoạt động không được đảm bảo.

Tiêu chuẩn cho biết, ví dụ: #include <stddef.h> phải cung cấp định nghĩa cho size_t phải là loại số nguyên không dấu. Nhưng nó cũng nói rằng không cần một tập tin gọi là stddef.h để tồn tại ở bất cứ đâu trên hệ thống tập tin. Và ngay cả khi triển khai cung cấp tệp như vậy nhưng tệp đó chỉ chứa dòng sau

#pragma stdlib_stddef_h 

sẽ hoàn toàn phù hợp nếu pragma ở trên cung cấp hiệu quả các tiêu chuẩn quy định cho tiêu đề đó.

Nói cách khác, size_t là một kiểu số nguyên không dấu vì đó là những gì tiêu chuẩn nói, không phải vì đó là những gì bạn có thể đọc trong một tệp tiêu đề.

3

Chỉ để hoàn thành, bạn đã xem xét đơn giản là hỏi C++ về size_t chưa?

#include <iostream> 
#include <cstddef> 
#include <limits> 

int main() 
{ 
    std::cout << "sizeof(size_t) = " << sizeof(std::size_t) << std::endl; 
    std::cout << "is size_t an integer? " << 
     (std::numeric_limits<std::size_t>::is_integer ? "yes" : "no") 
     << std::endl; 
    std::cout << "is size_t signed? " << 
     (std::numeric_limits<std::size_t>::is_signed ? "yes" : "no") 
     << std::endl; 
} 

mang lại cho tôi

sizeof(size_t) = 8 
is size_t an integer? yes 
is size_t signed? no 
5

gcc cung cấp một số các tiêu đề và đó là liên quan ở đây: size_t được định nghĩa trong stddef.h đó là một trong những tiêu đề. Đây là ví dụ tại /usr/lib/x86_64-redhat-linux/4.1.1/include/stddef.h.Có định nghĩa của size_t

typedef __SIZE_TYPE__ size_t; 

__SIZE_TYPE__ là một vĩ mô được xác định trước biên dịch (cho phép để đảm bảo rằng trình biên dịch và tiêu đề đồng ý và, như những gì mong đợi các trình biên dịch phụ thuộc vào đối số của nó - ví dụ với -m32 nó là một bit 32 bit chưa ký, và với -m64 một loại 64 bit không dấu -, để có tiêu đề độc lập với các đối số trình biên dịch).

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