Tôi đã chạy mã sau thông qua các trình biên dịch khác nhau:
int main()
{
float **a;
void **b;
b = a;
}
Từ những gì tôi đã có thể thu thập, void **
là không một con trỏ chung có nghĩa là bất kỳ chuyển đổi từ một con trỏ không nên biên dịch hoặc ít nhất là ném một cảnh báo. Tuy nhiên, đây là kết quả của tôi (tất cả được thực hiện trên Windows):
- gcc - Ném một cảnh báo, như mong đợi.
- g ++ - Ném lỗi, như mong đợi (điều này là do việc gõ C ++ ít được phép hơn, phải không?)
- MSVC (cl.exe) - Ném không có cảnh báo nào, ngay cả với / Tường được chỉ định.
Câu hỏi của tôi là: Tôi có thiếu điều gì về toàn bộ vấn đề không và có lý do cụ thể nào khiến MSVC không đưa ra cảnh báo không? MSVC không đưa ra cảnh báo khi chuyển đổi từ void **
sang float **
.
Một điều lưu ý khác: Nếu tôi thay thế a = b
bằng chuyển đổi rõ ràng a = (void **)b
, không có trình biên dịch nào đưa ra cảnh báo. Tôi nghĩ rằng đây là một diễn viên không hợp lệ, vậy tại sao không có bất kỳ cảnh báo nào?
Lý do tôi hỏi câu hỏi này là vì tôi đã bắt đầu học CUDA và trong Hướng dẫn lập trình chính thức ( https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#device-memory ) mã sau đây có thể được tìm thấy:
// Allocate vectors in device memory
float* d_A;
cudaMalloc(&d_A, size);
mà nên thực hiện một chuyển đổi ngầm định void **
cho &d_A
, như là đối số đầu tiên cudaMalloc
của kiểu void **
. Mã tương tự có thể được tìm thấy trên tất cả các tài liệu. Đây chỉ là công việc cẩu thả trên kết thúc của NVIDIA hay tôi, một lần nữa, thiếu một cái gì đó? Kể từ khi nvcc
sử dụng MSVC, mã sẽ biên dịch mà không có cảnh báo.
void**
không phải là một con trỏ chung. Chỉ void*
là
(void**)
là một phong cách c rõ ràng đúc. Nó bảo trình biên dịch không nhìn kỹ vào những gì bạn đang làm và tin tưởng bạn. Đó là ghi đè rõ ràng của hệ thống an toàn loại và trình biên dịch được yêu cầu chấp nhận về cơ bản bất kỳ loại chuyển đổi nào. Nên tránh các kiểu phôi C, chúng quá mạnh. Sử dụng các diễn viên C ++ như thế static_cast
sẽ phàn nàn nếu bạn đang cố gắng làm điều gì đó không có ý nghĩa.