forked from espressif/esp-idf
fix(system): rename __VA_NARG__ macro
__VA_NARG__ is copied from a forum post and is a pretty common implementation with a high chance of causing naming collision Added ESP_ namespace to avoid this.
This commit is contained in:
@@ -50,15 +50,15 @@ extern "C" {
|
|||||||
/* Count number of arguments of __VA_ARGS__
|
/* Count number of arguments of __VA_ARGS__
|
||||||
* - reference https://groups.google.com/forum/#!topic/comp.std.c/d-6Mj5Lko_s
|
* - reference https://groups.google.com/forum/#!topic/comp.std.c/d-6Mj5Lko_s
|
||||||
* - __GET_NTH_ARG__() takes args >= N (64) but only expand to Nth one (64th)
|
* - __GET_NTH_ARG__() takes args >= N (64) but only expand to Nth one (64th)
|
||||||
* - __RSEQ_N__() is reverse sequential to N to add padding to have Nth
|
* - ESP_RSEQ_N() is reverse sequential to N to add padding to have Nth
|
||||||
* position is the same as the number of arguments
|
* position is the same as the number of arguments
|
||||||
* - ##__VA_ARGS__ is used to deal with 0 parameter (swallows comma)
|
* - ##__VA_ARGS__ is used to deal with 0 parameter (swallows comma)
|
||||||
*/
|
*/
|
||||||
#ifndef __VA_NARG__
|
#ifndef ESP_VA_NARG
|
||||||
# define __VA_NARG__(...) __NARG__(_0, ##__VA_ARGS__, __RSEQ_N__())
|
# define ESP_VA_NARG(...) ESP_NARG(_0, ##__VA_ARGS__, ESP_RSEQ_N())
|
||||||
|
|
||||||
# define __NARG__(...) __GET_NTH_ARG__(__VA_ARGS__)
|
# define ESP_NARG(...) ESP_GET_NTH_ARG(__VA_ARGS__)
|
||||||
# define __GET_NTH_ARG__( \
|
# define ESP_GET_NTH_ARG( \
|
||||||
_01,_02,_03,_04,_05,_06,_07,_08,_09,_10, \
|
_01,_02,_03,_04,_05,_06,_07,_08,_09,_10, \
|
||||||
_11,_12,_13,_14,_15,_16,_17,_18,_19,_20, \
|
_11,_12,_13,_14,_15,_16,_17,_18,_19,_20, \
|
||||||
_21,_22,_23,_24,_25,_26,_27,_28,_29,_30, \
|
_21,_22,_23,_24,_25,_26,_27,_28,_29,_30, \
|
||||||
@@ -66,7 +66,7 @@ extern "C" {
|
|||||||
_41,_42,_43,_44,_45,_46,_47,_48,_49,_50, \
|
_41,_42,_43,_44,_45,_46,_47,_48,_49,_50, \
|
||||||
_51,_52,_53,_54,_55,_56,_57,_58,_59,_60, \
|
_51,_52,_53,_54,_55,_56,_57,_58,_59,_60, \
|
||||||
_61,_62,_63,N,...) N
|
_61,_62,_63,N,...) N
|
||||||
# define __RSEQ_N__() \
|
# define ESP_RSEQ_N() \
|
||||||
62,61,60, \
|
62,61,60, \
|
||||||
59,58,57,56,55,54,53,52,51,50, \
|
59,58,57,56,55,54,53,52,51,50, \
|
||||||
49,48,47,46,45,44,43,42,41,40, \
|
49,48,47,46,45,44,43,42,41,40, \
|
||||||
@@ -80,25 +80,6 @@ extern "C" {
|
|||||||
#define ESP_UNUSED(x) ((void)(x))
|
#define ESP_UNUSED(x) ((void)(x))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* test macros */
|
|
||||||
#define foo_args(...) 1
|
|
||||||
#define foo_no_args() 2
|
|
||||||
#if defined(__cplusplus) && (__cplusplus > 201703L)
|
|
||||||
#define foo(...) CHOOSE_MACRO_VA_ARG(foo_args, foo_no_args __VA_OPT__(,) __VA_ARGS__)(__VA_ARGS__)
|
|
||||||
#else
|
|
||||||
#define foo(...) CHOOSE_MACRO_VA_ARG(foo_args, foo_no_args, ##__VA_ARGS__)(__VA_ARGS__)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ESP_STATIC_ASSERT(foo() == 2, "CHOOSE_MACRO_VA_ARG() result does not match for 0 arguments");
|
|
||||||
ESP_STATIC_ASSERT(foo(42) == 1, "CHOOSE_MACRO_VA_ARG() result does not match for 1 argument");
|
|
||||||
#if defined(__cplusplus) && (__cplusplus > 201703L)
|
|
||||||
ESP_STATIC_ASSERT(foo(42, 87) == 1, "CHOOSE_MACRO_VA_ARG() result does not match for n arguments");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#undef foo
|
|
||||||
#undef foo_args
|
|
||||||
#undef foo_no_args
|
|
||||||
|
|
||||||
#define ESP_INFINITE_LOOP() \
|
#define ESP_INFINITE_LOOP() \
|
||||||
do { \
|
do { \
|
||||||
ESP_COMPILER_DIAGNOSTIC_PUSH_IGNORE("-Wanalyzer-infinite-loop") \
|
ESP_COMPILER_DIAGNOSTIC_PUSH_IGNORE("-Wanalyzer-infinite-loop") \
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
idf_component_register(SRCS "test_app_main.c" "test_attr.c"
|
idf_component_register(SRCS "test_app_main.c" "test_attr.c" "test_esp_macro.c"
|
||||||
INCLUDE_DIRS "."
|
INCLUDE_DIRS "."
|
||||||
PRIV_REQUIRES unity esp_mm esp_psram
|
PRIV_REQUIRES unity esp_mm esp_psram
|
||||||
WHOLE_ARCHIVE)
|
WHOLE_ARCHIVE)
|
||||||
|
@@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||||
|
*/
|
||||||
|
#include "esp_macros.h"
|
||||||
|
|
||||||
|
/* test macros */
|
||||||
|
#define foo_args(...) 1
|
||||||
|
#define foo_no_args() 2
|
||||||
|
#if defined(__cplusplus) && (__cplusplus > 201703L)
|
||||||
|
#define foo(...) CHOOSE_MACRO_VA_ARG(foo_args, foo_no_args __VA_OPT__(,) __VA_ARGS__)(__VA_ARGS__)
|
||||||
|
#else
|
||||||
|
#define foo(...) CHOOSE_MACRO_VA_ARG(foo_args, foo_no_args, ##__VA_ARGS__)(__VA_ARGS__)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ESP_STATIC_ASSERT(foo() == 2, "CHOOSE_MACRO_VA_ARG() result does not match for 0 arguments");
|
||||||
|
ESP_STATIC_ASSERT(foo(42) == 1, "CHOOSE_MACRO_VA_ARG() result does not match for 1 argument");
|
||||||
|
#if defined(__cplusplus) && (__cplusplus > 201703L)
|
||||||
|
ESP_STATIC_ASSERT(foo(42, 87) == 1, "CHOOSE_MACRO_VA_ARG() result does not match for n arguments");
|
||||||
|
#endif
|
@@ -396,9 +396,9 @@ void *regdma_find_prev_module_link_tail(void *link, void *tail, int entry, uint3
|
|||||||
*/
|
*/
|
||||||
void *regdma_find_next_module_link_head(void *link, void *tail, int entry, uint32_t module);
|
void *regdma_find_next_module_link_head(void *link, void *tail, int entry, uint32_t module);
|
||||||
|
|
||||||
#define regdma_link_init_safe(pcfg, branch, module, ...) regdma_link_init((pcfg), (branch), (module), __VA_NARG__(__VA_ARGS__), ##__VA_ARGS__)
|
#define regdma_link_init_safe(pcfg, branch, module, ...) regdma_link_init((pcfg), (branch), (module), ESP_VA_NARG(__VA_ARGS__), ##__VA_ARGS__)
|
||||||
|
|
||||||
#define regdma_link_update_next_safe(link, ...) regdma_link_update_next((link), __VA_NARG__(__VA_ARGS__), ##__VA_ARGS__)
|
#define regdma_link_update_next_safe(link, ...) regdma_link_update_next((link), ESP_VA_NARG(__VA_ARGS__), ##__VA_ARGS__)
|
||||||
|
|
||||||
#endif // SOC_PAU_SUPPORTED
|
#endif // SOC_PAU_SUPPORTED
|
||||||
|
|
||||||
|
@@ -3,6 +3,11 @@ System
|
|||||||
|
|
||||||
:link_to_translation:`zh_CN:[中文]`
|
:link_to_translation:`zh_CN:[中文]`
|
||||||
|
|
||||||
|
ESP-Common
|
||||||
|
----------
|
||||||
|
|
||||||
|
``__VA_NARG__`` and its related macros have been re-named to avoid naming collisions, use the new name with ``ESP`` pre-fix, e.g. ``ESP_VA_NARG`` instead.
|
||||||
|
|
||||||
Log
|
Log
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@@ -3,6 +3,11 @@
|
|||||||
|
|
||||||
:link_to_translation:`en:[English]`
|
:link_to_translation:`en:[English]`
|
||||||
|
|
||||||
|
ESP-Common
|
||||||
|
----------
|
||||||
|
|
||||||
|
``__VA_NARG__`` 及其相关宏已被重新命名以避免命名冲突,请使用带有 ESP 前缀的新名称,例如 ``ESP_VA_NARG``。
|
||||||
|
|
||||||
日志
|
日志
|
||||||
------
|
------
|
||||||
|
|
||||||
|
@@ -447,3 +447,6 @@
|
|||||||
-
|
-
|
||||||
re: "(error: Total discarded sections size is \\d+ bytes)|(region [`'.\\w]+ overflowed by \\d+ bytes)"
|
re: "(error: Total discarded sections size is \\d+ bytes)|(region [`'.\\w]+ overflowed by \\d+ bytes)"
|
||||||
hint: "The binary size has exceeded the limit. To resolve the issue consider reducing the binary size.\nYou can explore size optimization techniques in the documentation by running 'idf.py docs -sp api-guides/performance/size.html#reducing-overall-size'.\nNote that the linker performed the dead code elimination."
|
hint: "The binary size has exceeded the limit. To resolve the issue consider reducing the binary size.\nYou can explore size optimization techniques in the documentation by running 'idf.py docs -sp api-guides/performance/size.html#reducing-overall-size'.\nNote that the linker performed the dead code elimination."
|
||||||
|
|
||||||
|
re: "implicit declaration of function '__VA_NARG__'"
|
||||||
|
hint: "__VA_NARG_ has been renamed. Please use ESP_VA_NARG instead"
|
||||||
|
Reference in New Issue
Block a user