Có bất kỳ nội dung tương đương nào trong số _countof
được cung cấp bởi các trình biên dịch khác, cụ thể là GCC và Clang không? Có bất kỳ hình thức không vĩ mô nào không?Tương đương với MSVC's _countof trong các trình biên dịch khác?
Trả lời
Điều này?
#define _countof(a) (sizeof(a)/sizeof(*(a)))
Tôi không nhận thức được một cho GCC, nhưng Linux sử dụng GCC's __builtin_types_compatible_p
builtin để làm cho họ ARRAY_SIZE()
vĩ mô an toàn hơn (nó sẽ gây ra một sự đột phá xây dựng nếu áp dụng cho một con trỏ):
/* &a[0] degrades to a pointer: a different type from an array */
#define __must_be_array(a) \
BUILD_BUG_ON_ZERO(__builtin_types_compatible_p(typeof(a), typeof(&a[0])))
#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof((arr)[0]) + __must_be_array(arr))
Lưu ý: Tôi nghĩ rằng macro BUILD_BUG_ON_ZERO()
có tên gây hiểu lầm (nó gây ra lỗi xây dựng nếu biểu thức là không không và trả về 0
nếu không):
/* Force a compilation error if condition is true, but also produce a
result (of value 0 and type size_t), so the expression can be used
e.g. in a structure initializer (or where-ever else comma expressions
aren't permitted). */
#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
Tôi nghĩ việc đặt tên cho macro này xuất phát từ việc xem xét nó trong hai phần: BUILD_BUG_ON
là macro làm gì khi biểu thức là đúng và ZERO
là giá trị 'được trả về' bởi macro (nếu không có bản dựng phá vỡ).
Sử dụng C++ 11, hình thức phi vĩ mô là:
char arrname[5];
size_t count = std::extent< decltype(arrname) >::value;
Và extent
có thể được tìm thấy trong type_traits
tiêu đề.
Hoặc nếu bạn muốn nó trông đẹp hơn một chút, quấn nó trong này:
template < typename T, size_t N >
size_t countof(T (& arr)[ N ])
{
return std::extent< T[ N ] >::value;
}
Và sau đó nó trở thành:
char arrname[5];
size_t count = countof(arrname);
char arrtwo[5][6];
size_t count_fst_dim = countof(arrtwo); // 5
size_t count_snd_dim = countof(arrtwo[0]); // 6
Edit: Tôi chỉ nhận thấy "C" gắn cờ thay vì "C++". Vì vậy, nếu bạn đang ở đây cho C, xin vui lòng bỏ qua bài đăng này. Cảm ơn.
Một khác biệt: ít nhất là trên MSVC, std :: extent
Ngoài ra thử nghiệm nó trên GCC và rằng quá, trả về 0. – Ash
Bạn phải làm cho countof chức năng của bạn constexpr, nếu không nó sẽ không hoạt động. Ngoài ra, nó đơn giản hơn để "trả về N;" thay vì "std :: mức độ < T[ N ] > :: giá trị;". – prgDevelop
Bạn có thể sử dụng thay vì boost::size():
#include <boost/range.hpp>
int my_array[10];
boost::size(my_array);
Boost là C++, trong khi các câu hỏi được gắn thẻ là C. – tambre
Câu trả lời bình chọn hàng đầu cũng là C++, như là '_countof' thực hiện trong MSVC – KindDragon
Tôi sẽ không xem xét rằng biện minh cho việc đăng câu trả lời cho một ngôn ngữ khác trên một câu hỏi không được gắn thẻ bằng ngôn ngữ đó. – tambre
- 1. Tùy chọn -g của g ++ tương đương với trình biên dịch cl VS2010?
- 2. Trình biên dịch Visual Studio C có tương đương với GCC's-M không?
- 3. Trình biên dịch/trình biên dịch/trình biên dịch C++
- 4. Tương đương với "Trình biên dịch đóng cửa của Google" cho HTML?
- 5. Tương đương với Trình nạp Lớp trong .NET
- 6. C++ Tương đương với Trình khởi tạo được Chỉ định?
- 7. Tương đương với "bảng điều khiển lỗi" của Firefox trong các trình duyệt khác
- 8. Tương đương với việc tạo ra ánh sáng trường trong các trình duyệt khác?
- 9. __LINE__ tương đương với Java?
- 10. Trình biên dịch biên dịch trong C#
- 11. hành vi trình biên dịch khác nhau khi thêm byte
- 12. Làm cách nào để áp dụng các tùy chọn trình biên dịch khác nhau cho các trình biên dịch khác nhau trong cmake?
- 13. Haskell tương đương với Boost.Fusion
- 14. LINQ/Lambda tương đương với SQL trong
- 15. Tại sao mã của tôi biên dịch trong VB.NET nhưng tương đương trong C# không
- 16. Phát hiện trình biên dịch với #ifdef
- 17. Các chức năng tương đương tạo ra các kết quả phiên dịch khác nhau
- 18. Haskell cho trình biên dịch Javascript?
- 19. GCC tương đương với PDBs
- 20. Dịch vụ RESTful - WSDL Tương đương
- 21. Tránh các vấn đề về trình biên dịch với abs()
- 22. AF_UNIX tương đương với Windows
- 23. Phương thức lớp tương đương với -respondsToSelector:
- 24. Tương đương với ctrl c trong lệnh hủy chương trình
- 25. Python tương đương với find2perl
- 26. Tương đương với các giao diện Java trong C++?
- 27. Vải tương đương trong Haskell?
- 28. NSTask hoặc tương đương với iPhone
- 29. gcc được biên dịch với các kích thước khác nhau?
- 30. Làm cách nào để tương tác với trình biên dịch trong chính mã Scala?
đó sẽ là không an toàn khi a là một con trỏ (so với mảng). macro _countof là an toàn. – Uri