Bài này viết về kiểu void trong các ngôn ngữ lập trình. Đối với các kiểu void thiên văn học, xem void (thiên văn học). Đối với các cách sử dụng khác, xem Void (định hướng).
Trong nhiều ngôn ngữ lập trình bắt nguồn từ C và Algol68, **kiểu void** (tiếng Anh: *void type*) là một kiểu kết quả của hàm nếu hàm này không trả về bất kì kết quả (giá trị) nào. Những hàm như thế thường được gọi trong chương trình vì những hiệu ứng biên của chúng. Các kiểu void có cùng mục đích với *các cấu trúc cú pháp xác định các subroutine* (đoạn chương trình con) trong Visual Basic và các procedure (*thủ tục*) trong ngôn ngữ lập trình Pascal. Trong những trường hợp như vậy, kiểu void có mục đích tương tự như kiểu unit (kiểu đơn vị) từ các ngôn ngữ lập trình hàm; tuy nhiên, có nhiều sự khác biệt trong các cách dùng được cho phép, như kiểu void được lấy làm kiểu rỗng và không có giá trị. Để dễ so sánh, xin hãy xem thêm đề mục Kiểu unit#Trong các ngôn ngữ lập trình.

Ngôn ngữ C và C++ cũng cung cấp **con trỏ chỉ kiểu void** (được đặc tả bởi `void *`), nhưng đây là một khái niệm không có liên quan. Các biến kiểu này là các con trỏ chỉ đến dữ liệu của một kiểu *chưa được xác định*, vì thế ở ngữ cảnh này (nhưng không phải trong những ngữ cảnh khác) void đóng vai trò như một *kiểu vạn năng* hay kiểu top. Một chương trình có thể chuyển đổi một *con trỏ chỉ đến kiểu bất kì của dữ liệu* thành một *con trỏ chỉ đến kiểu void* và quay ngược lại kiểu ban đầu mà không làm mất thông tin, điều này khiến cho các con trỏ trở nên hữu ích trong các hàm đa hình (polymorphic function) (chú ý điều này không thật đúng đối với các con trỏ hàm vì các hàm không phải là dữ liệu).

Lịch sử
-------

Trong số những ngôn ngữ lập trình hiện đại, từ khóa void lần đầu tiên xuất hiện trong C++ để hỗ trợ cho khái niệm con trỏ được tổng quát hóa. Tuy nhiên, nhờ sự vay mượn nhanh chóng từ C++, tài liệu tiêu chuẩn đầu tiên chứa từ khóa void đã trở thành chuẩn của ngôn ngữ C và đã được ANSI công bố vào năm 1989. Trong phạm vi ngôn ngữ C++, void đã được chuẩn hóa vào năm 1998.

Sau này, từ khóa void và những cấu trúc ngôn ngữ liên quan đến nó đã được thừa kế bởi các ngôn ngữ Java, C# và D.

Cú pháp
-------

Ngữ nghĩa
---------

Ngôn ngữ C trước khi có kiểu void
---------------------------------

Void trong các ngôn ngữ lập trình C và C++
------------------------------------------

Một hàm có kiểu kết quả void kết thúc hoạt động bằng cách hoặc chạm tới điểm kết thúc của hàm hoặc thực hiện một lệnh trả về mà không có giá trị trả về. Kiểu void có thể cũng xuất hiện như là đối số (argument) duy nhất của một nguyên mẫu hàm (function prototype) nhằm xác định là hàm không có tham số nào cả. Chú ý rằng, mặc dù có tên, nhưng trong tất cả những trường hợp này, kiểu void được dùng làm kiểu unit, chứ không làm số 0 (zero) hay kiểu đáy, thậm chí không giống như một kiểu unit thực sự là kiểu đơn nhất, kiểu void bao gồm một tập hợp rỗng các giá trị, và ngôn ngữ không cung cấp bất cứ cách nào để khai báo một đối tượng hoặc biểu diễn một giá trị với kiểu `void`.

Trong những phiên bản sớm nhất của C, các hàm không có kết quả xác định đã được mặc định kiểu trả về của `int` và các hàm không có đối số đã dễ dàng có các danh sách đối số rỗng. Các con trỏ chỉ dữ liệu không được định kiểu đã được khai báo như là các số nguyên (integer) hoặc con trỏ chỉ `char`. Một vài trình biên dịch C lúc ban đầu đã có đặc điểm mà ngày nay bị xem là phiền toái, đó là phát sinh cảnh báo cho bất kì lời gọi hàm nào không sử dụng giá trị trả về của hàm. Mã cũ đôi khi vứt bỏ những lời gọi hàm như vậy để tránh kết liễu cảnh báo này. Lúc Bjarne Stroustrup bắt đầu công trình của ông ấy trên C++ vào 1979-1980, void và con trỏ void đã từng là một phần của phương ngữ ngôn ngữ C được hỗ trợ bởi các trình biên dịch bắt nguồn từ AT&T.

Việc sử dụng tường minh void và việc không cho các đối số ở trong một nguyên mẫu hàm có các ngữ nghĩa khác nhau trong C và C++, và được chi tiết hóa trong bảng sau đây:

| C++ | C tương đương |
| --- | --- |
| `void f(); //được ưa thích hơn cả` | `void f(void);` |
| `void f(void);` | `void f(void);` |
| `void f(...); //Chấp nhận bất kì đối số nào` | `void f(); /*Chấp nhận bất kì đối số nào*/` |

Tuy nhiên, một nguyên mẫu C không lấy các đối số, ví dụ `void f()` ở trên, đã bị phản đối trong C99.

Tham khảo
---------

1. ↑  generic-function-pointers-in-c-and-void
2. ↑  "Standardisation."[*liên kết hỏng*]
3. ↑  Stroustrup, Bjarne (2009). *Programming: Principles and Practice Using C++*. Boston: Addison-Wesley. tr. 996. ISBN 0321543726.
4. ↑  Bjarne Stroustrup, *C and C++: Case Studies in Compatibility. Reconcilable differences? You decide*, Dr. Dobb's, ngày 1 tháng 9 năm 2002; print version Lưu trữ 2011-08-10 tại Wayback Machine

| * x
* t
* s
Các kiểu dữ liệu |
| --- |
| Không xác định | 
* Bit
* Byte
* Trit
* Tryte
* Word
* Mảng bit

 |
| Số | 
* Độ chính xác tùy ý hay bignum
* Phức
* Thập phân
* Dấu phẩy tĩnh
* Dấu phẩy động
	+ Độ chính xác thấp
		- Minifloat
		- Bán chính xác
		- bfloat16
	+ Độ chính xác đơn
	+ Độ chính xác kép
	+ Độ chính xác bậc bốn
	+ Độ chính xác bậc tám
	+ Độ chính xác mở rộng
		- Long double
* Nguyên
	+ có dấu và không dấu
* Khoảng
* Hữu tỉ

 |
| Con trỏ | 
* Địa chỉ
	+ vật lý
	+ ảo
* Tham chiếu

 |
| Văn bản | 
* Ký tự
* Chuỗi
	+ kết thúc rỗng

 |
| Phức hợp | 
* Kiểu dữ liệu đại số
	+ tổng quát
* Mảng
* Mảng kết hợp
* Lớp
* Phụ thuộc
* Equality
* Quy nạp
* Giao
* Danh sách
* Đối tượng
	+ siêu đối tượng
* Kiểu tùy chọn
* Tích
* Bản ghi hay Struct
* Refinement
* Tập hợp
* Hợp
	+ tagged

 |
| Khác | 
* Boole
* Kiểu đáy
* Collection
* Kiểu liệt kê
* Ngoại lệ
* Kiểu hàm
* Kiểu dữ liệu mờ
* Kiểu dữ liệu đệ quy
* Đèn báo
* Stream
* Kiểu đỉnh
* Lớp kiểu
* Kiểu đơn vị
* Void

 |
| Chủ đềliên quan | 
* Kiểu dữ liệu trừu tượng
* Cấu trúc dữ liệu
* Tổng quát
* Kind
	+ siêu lớp
* Kiểu đối tượng
* Đa hình tham số
* Kiểu dữ liệu cơ bản
* Giao thức
	+ giao diện
* Đa hình dẫn xuất
* Hàm tạo kiểu
* Chuyển đổi kiểu
* Hệ thống kiểu
* Lý thuyết hình thái
* Biến

 |