123456789101112131415161718192021222324252627282930313233343536373839404142 |
- #ifndef Py_PYMACRO_H
- #define Py_PYMACRO_H
- /* Assert a build-time dependency, as an expression.
- Your compile will fail if the condition isn't true, or can't be evaluated
- by the compiler. This can be used in an expression: its value is 0.
- Example:
- #define foo_to_char(foo) \
- ((char *)(foo) \
- + Py_BUILD_ASSERT_EXPR(offsetof(struct foo, string) == 0))
- Written by Rusty Russell, public domain, http://ccodearchive.net/ */
- #define Py_BUILD_ASSERT_EXPR(cond) \
- (sizeof(char [1 - 2*!(cond)]) - 1)
- /* Get the number of elements in a visible array
- This does not work on pointers, or arrays declared as [], or function
- parameters. With correct compiler support, such usage will cause a build
- error (see Py_BUILD_ASSERT_EXPR).
- Written by Rusty Russell, public domain, http://ccodearchive.net/
- Requires at GCC 3.1+ */
- #if (defined(__GNUC__) && !defined(__STRICT_ANSI__) && \
- (((__GNUC__ == 3) && (__GNU_MINOR__ >= 1)) || (__GNUC__ >= 4)))
- /* Two gcc extensions.
- &a[0] degrades to a pointer: a different type from an array */
- #define Py_ARRAY_LENGTH(array) \
- (sizeof(array) / sizeof((array)[0]) \
- + Py_BUILD_ASSERT_EXPR(!__builtin_types_compatible_p(typeof(array), \
- typeof(&(array)[0]))))
- #else
- #define Py_ARRAY_LENGTH(array) \
- (sizeof(array) / sizeof((array)[0]))
- #endif
- #endif /* Py_PYMACRO_H */
|