OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef MOJO_PUBLIC_C_SYSTEM_MACROS_H_ | 5 #ifndef MOJO_PUBLIC_C_SYSTEM_MACROS_H_ |
6 #define MOJO_PUBLIC_C_SYSTEM_MACROS_H_ | 6 #define MOJO_PUBLIC_C_SYSTEM_MACROS_H_ |
7 | 7 |
8 #include <stddef.h> | 8 #include <stddef.h> |
9 | 9 |
10 // Annotate a variable indicating it's okay if it's unused. | 10 // Annotate a variable indicating it's okay if it's unused. |
11 // Use like: | 11 // Use like: |
12 // int x MOJO_ALLOW_UNUSED = ...; | 12 // int x MOJO_ALLOW_UNUSED = ...; |
13 #if defined(__GNUC__) | 13 #if defined(__GNUC__) |
14 #define MOJO_ALLOW_UNUSED __attribute__((unused)) | 14 #define MOJO_ALLOW_UNUSED __attribute__((unused)) |
15 #else | 15 #else |
16 #define MOJO_ALLOW_UNUSED | 16 #define MOJO_ALLOW_UNUSED |
17 #endif | 17 #endif |
18 | 18 |
19 // Annotate a function indicating that the caller must examine the return value. | 19 // Annotate a function indicating that the caller must examine the return value. |
20 // Use like: | 20 // Use like: |
21 // int foo() MOJO_WARN_UNUSED_RESULT; | 21 // int foo() MOJO_WARN_UNUSED_RESULT; |
22 // Note that it can only be used on the prototype, and not the definition. | 22 // Note that it can only be used on the prototype, and not the definition. |
23 #if defined(__GNUC__) | 23 #if defined(__GNUC__) |
24 #define MOJO_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) | 24 #define MOJO_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) |
25 #else | 25 #else |
26 #define MOJO_WARN_UNUSED_RESULT | 26 #define MOJO_WARN_UNUSED_RESULT |
27 #endif | 27 #endif |
28 | 28 |
29 // Assert things at compile time. (|msg| should be a valid identifier name.) | |
29 // This macro is currently C++-only, but we want to use it in the C core.h. | 30 // This macro is currently C++-only, but we want to use it in the C core.h. |
30 // Used to assert things at compile time. | 31 // Use like: |
32 // MOJO_COMPILE_ASSERT(sizeof(Foo) == 12, Foo_has_invalid_size); | |
31 #if __cplusplus >= 201103L | 33 #if __cplusplus >= 201103L |
32 #define MOJO_COMPILE_ASSERT(expr, msg) static_assert(expr, #msg) | 34 #define MOJO_COMPILE_ASSERT(expr, msg) static_assert(expr, #msg) |
33 #elif defined(__cplusplus) | 35 #elif defined(__cplusplus) |
34 namespace mojo { template <bool> struct CompileAssert {}; } | 36 namespace mojo { template <bool> struct CompileAssert {}; } |
35 #define MOJO_COMPILE_ASSERT(expr, msg) \ | 37 #define MOJO_COMPILE_ASSERT(expr, msg) \ |
36 typedef ::mojo::CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1] | 38 typedef ::mojo::CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1] |
37 #else | 39 #else |
38 #define MOJO_COMPILE_ASSERT(expr, msg) | 40 #define MOJO_COMPILE_ASSERT(expr, msg) |
39 #endif | 41 #endif |
40 | 42 |
43 // Like the C++11 |alignof| operator. | |
44 #if __cplusplus >= 201103L | |
45 #define MOJO_ALIGNOF(type) alignof(type) | |
darin (slow to review)
2014/05/28 21:35:14
I wonder if these shouldn't be MOJO_ALIGN_OF and M
| |
46 #elif defined(__GNUC__) | |
47 #define MOJO_ALIGNOF(type) __alignof__(type) | |
48 #elif defined(_MSC_VER) | |
49 // The use of |sizeof| is to work around a bug in MSVC 2010 (see | |
50 // http://goo.gl/isH0C; supposedly fixed since then). | |
51 #define MOJO_ALIGNOF(type) (sizeof(type) - sizeof(type) + __alignof(type)) | |
52 #else | |
53 #error "Please define MOJO_ALIGNOF() for your compiler." | |
54 #endif | |
55 | |
56 // Specify the alignment of a |struct|, etc. | |
57 // Use like: | |
58 // struct MOJO_ALIGNAS(8) Foo { ... }; | |
59 #if defined(__GNUC__) | |
60 #define MOJO_ALIGNAS(alignment) __attribute__((aligned(alignment))) | |
61 #elif defined(_MSC_VER) | |
62 #define MOJO_ALIGNAS(alignment) __declspec(align(alignment)) | |
63 #else | |
64 #error "Please define MOJO_ALIGNAS() for your compiler." | |
65 #endif | |
66 | |
41 #endif // MOJO_PUBLIC_C_SYSTEM_MACROS_H_ | 67 #endif // MOJO_PUBLIC_C_SYSTEM_MACROS_H_ |
OLD | NEW |