Program Listing for File macros.h
↰ Return to documentation for file (include/rcutils/macros.h
)
^^^^^^^^^ ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^ ^^^
ARG 1 ARG 2 ARG 3 ARG 4
format string first optional argument
// Copyright 2017 Open Source Robotics Foundation, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef RCUTILS__MACROS_H_
#define RCUTILS__MACROS_H_
#ifdef __cplusplus
extern "C"
{
#endif
#ifndef _MSC_VER
#define RCUTILS_WARN_UNUSED __attribute__((warn_unused_result))
#else
#define RCUTILS_WARN_UNUSED _Check_return_
#endif
// This block either sets RCUTILS_THREAD_LOCAL or RCUTILS_THREAD_LOCAL_PTHREAD.
#if defined _WIN32 || defined __CYGWIN__
// Windows or Cygwin
#define RCUTILS_THREAD_LOCAL __declspec(thread)
#elif defined __APPLE__
// Apple OS's
#include <TargetConditionals.h>
#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE
// iOS Simulator or iOS device
#include <Availability.h>
#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED)
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 100000
// iOS >= 10, thread local storage was added in iOS 10
#define RCUTILS_THREAD_LOCAL _Thread_local
#else
// iOS < 10, no thread local storage, so use pthread instead
#define RCUTILS_THREAD_LOCAL_PTHREAD 1
#undef RCUTILS_THREAD_LOCAL
#endif
#else
#error "Unknown iOS version"
#endif
#elif TARGET_OS_MAC
// macOS
#define RCUTILS_THREAD_LOCAL _Thread_local
#else
#error "Unknown Apple platform"
#endif
#else
// Some other non-Windows, non-cygwin, non-apple OS
#define RCUTILS_THREAD_LOCAL _Thread_local
#endif
// Helper macros for nested macro expansion
#define RCUTILS_EXPAND(x) x
#define RCUTILS_STRINGIFY_IMPL(x) #x
#define RCUTILS_STRINGIFY(x) RCUTILS_STRINGIFY_IMPL(x)
#define RCUTILS_UNUSED(x) (void)(x)
#define RCUTILS_JOIN_IMPL(arg1, arg2) arg1 ## arg2
#define RCUTILS_JOIN(arg1, arg2) RCUTILS_JOIN_IMPL(arg1, arg2)
#if defined _WIN32 || defined __CYGWIN__
#define RCUTILS_ATTRIBUTE_PRINTF_FORMAT(format_string_index, first_to_check_index)
#else
#define RCUTILS_ATTRIBUTE_PRINTF_FORMAT(format_string_index, first_to_check_index) \
__attribute__ ((format(printf, format_string_index, first_to_check_index)))
#endif // !defined _WIN32 || defined __CYGWIN__
#ifndef _WIN32
# define RCUTILS_DEPRECATED __attribute__((deprecated))
#else
# define RCUTILS_DEPRECATED __declspec(deprecated)
#endif
#ifndef _WIN32
# define RCUTILS_DEPRECATED_WITH_MSG(msg) __attribute__((deprecated(msg)))
#else
# define RCUTILS_DEPRECATED_WITH_MSG(msg) __declspec(deprecated(msg))
#endif
// Provide the compiler with branch prediction information
#ifndef _WIN32
# define RCUTILS_LIKELY(x) __builtin_expect((x), 1)
# define RCUTILS_UNLIKELY(x) __builtin_expect((x), 0)
#else
# define RCUTILS_LIKELY(x) (x)
# define RCUTILS_UNLIKELY(x) (x)
#endif // _WIN32
// Provide the compiler a hint about an argument being nonnull when possible.
#ifndef _WIN32
# define RCUTILS_NONNULL __attribute__((__nonnull__))
# define RCUTILS_NONNULL_ARGS(...) __attribute__((__nonnull__(__VA_ARGS__)))
# define RCUTILS_RETURNS_NONNULL __attribute__((__returns_nonnull__))
# define RCUTILS_HAS_NONNULL 1
#else
# define RCUTILS_NONNULL
# define RCUTILS_NONNULL_ARGS(...)
# define RCUTILS_RETURNS_NONNULL
# define RCUTILS_HAS_NONNULL 0
#endif // _WIN32
#if defined RCUTILS_ENABLE_FAULT_INJECTION
#include "rcutils/testing/fault_injection.h"
# define RCUTILS_CAN_RETURN_WITH_ERROR_OF(error_return_value) \
RCUTILS_FAULT_INJECTION_MAYBE_RETURN_ERROR(error_return_value);
# define RCUTILS_CAN_FAIL_WITH(failure_code) \
RCUTILS_FAULT_INJECTION_MAYBE_FAIL(failure_code);
#else
# define RCUTILS_CAN_RETURN_WITH_ERROR_OF(error_return_value)
# define RCUTILS_CAN_FAIL_WITH(failure_code)
#endif // defined RCUTILS_ENABLE_FAULT_INJECTION
#ifdef __cplusplus
}
#endif
#endif // RCUTILS__MACROS_H_