2012-04-28 24 views
6

Giả sử có một API C++ 11 có sử dụng lớp enum:liên kết tương thích của enums và enum lớp

// api.hpp 
enum class E {A, B, C}; 
void f(E); 
... 

// api.cpp 
void f(E e) 
{ 
    if (e == E::A) 
     ... 
} 

Bây giờ giả sử tôi muốn sử dụng API này, nhưng tôi không có một C + Trình biên dịch +11. Vì vậy, tôi:

  • Sửa đổi api.hpp và thay đổi lớp enum thành một môi trường thường xuyên.
  • Viết một số mã bao gồm sửa đổi api.hpp và sử dụng API bình thường (ví dụ: cuộc gọi f).
  • Biên dịch mã này bằng trình biên dịch không phải C++ 11 của tôi và liên kết nó với API thực hiện được biên dịch bằng trình biên dịch C++ 11 (sử dụng chưa sửa đổi api.hpp).

Điều này dường như hoạt động với GCC, nhưng nói chung là an toàn, hay tôi đang chơi với lửa (vi phạm ODR và ​​như vậy)?

Giả sử hai trình biên dịch tương thích với nhau, nó chỉ là lớp enum và enum đang được đề cập.

Trả lời

5

Giống như ildjarn đang nói, đây là hành vi không xác định. Và lý do mà điều này thực sự có thể thất bại trong việc triển khai thực sự là các cỗ máy C++ 03 bình thường không có kiểu cơ bản cố định. Trong khi loại enum-class của bạn luôn luôn có "int" là kiểu cơ bản của nó, một C++ 03 enum tương ứng có thể có "ngắn" như kiểu cơ bản của nó, làm cho mã không được bố trí tương thích.