2010-01-27 37 views
14

Các mã sau đây:Đúc một hằng số để một đoàn

#include <stdio.h> 

typedef union { 
    int n; 
    char *s; 
} val_t; 

int main(void) { 
    val_t v1,v2; 

    v1 = (val_t)"Hello World"; 
    v2 = (val_t)10; 

    printf("%s %d\n", v1.s, v2.n); 
    return(1); 
} 

biên dịch và thực hiện một cách chính xác với gcc. Nếu một cố gắng để đúc một hằng số mà không có một lĩnh vực phù hợp trong liên minh, một thông báo lỗi được tạo ra.

Nhìn vào tiêu chuẩn (C99), tuy nhiên, tôi không thể xác định được phần mà hành vi này được mô tả. Do đó, câu hỏi của tôi:

Tiêu chuẩn C có đảm bảo rằng tôi có thể đúc liên tục thành loại công đoàn, với điều kiện loại công đoàn có trường có loại tương thích không?

hoặc, nói cách khác:

((val_t)10) một rvalue hợp lệ của loại val_t?

Cũng sẽ rất thú vị nếu biết hành vi này được hỗ trợ bởi các trình biên dịch khác (hoặc ít nhất là MS Visual C++). Có ai biết không?

CHỈNH SỬA: Truyền tới công đoàn là phần mở rộng GCC, vì vậy không nên sử dụng nó.

Nhờ Maurits và Neil! Tôi không nghĩ về việc sử dụng -pantic để kiểm tra!

+1

Ngoài thực tế là điều này trông giống như thực tế lập trình khá xấu, đó là một câu hỏi thú vị. Tôi nghĩ rằng sau 20 năm lập trình C tôi đã nhìn thấy tất cả, Rõ ràng là không :) –

+1

@MauritsRijk Nó thực sự là một cách tuyệt vời để thực hiện các thùng chứa chung trong C. Bạn làm cho chìa khóa của container một loại công đoàn với các lĩnh vực như int , con trỏ kép và void, và hàm so sánh mà bạn truyền vào biết loại nào cần và truy cập thành viên thích hợp của công đoàn. Tôi thực sự không thấy lý do tại sao nó không phải là một phần chuẩn của ngôn ngữ, vì cách thức liên kết được định nghĩa trong K & R, mỗi thành viên được liên kết với địa chỉ thấp nhất, công đoàn được đảm bảo có sự liên kết bộ nhớ phù hợp cho tất cả các thành viên của nó. đủ rộng để giữ cái rộng nhất. –

Trả lời

5

Trong GNU C language extensions truyền tới công đoàn được đánh dấu là phần mở rộng cho tiêu chuẩn C. Vì vậy, hầu hết có thể bạn sẽ không tìm thấy nó trong C99 hoặc bất kỳ tiêu chuẩn C khác. Trình biên dịch C của IBM cũng hỗ trợ phần mở rộng này.

5
[[email protected] NeilB]$ gcc -Wall -pedantic sw.c 
sw.c: In function 'main': 
sw.c:11: warning: ISO C forbids casts to union type 
sw.c:12: warning: ISO C forbids casts to union type 
Các vấn đề liên quan