feat(pproc): 实现预处理器条件编译和可变参数宏支持
- 添加了完整的条件编译功能,包括 #if、#elif、#else、#endif 指令 - 实现了数值常量表达式的解析和求值 - 支持嵌套条件编译和与其他指令混合使用 - 实现了可变参数宏定义和 __VA_ARGS__ 替换功能 - 改进了宏展开机制以正确处理可变参数宏 - 重构了预处理器指令处理逻辑,提高了代码可维护性 - 添加了相应的单元测试用例验证新功能
This commit is contained in:
@@ -350,6 +350,64 @@ static void test_conditional_ifdef(void) {
|
||||
"x defined\nY not defined\nafter inner\n");
|
||||
}
|
||||
|
||||
static void test_simple_number_conditional_if(void) {
|
||||
TEST_CASE("if and elif with one integer constants");
|
||||
|
||||
// 基本 if
|
||||
CHECK_PP_OUTPUT_EXACT("#if 1\ntrue\n#endif\n", "true\n");
|
||||
CHECK_PP_OUTPUT_EXACT("#if 0\nfalse\n#endif\n", "");
|
||||
CHECK_PP_OUTPUT_EXACT("#if 4\ntrue\n#endif\n", "true\n");
|
||||
CHECK_PP_OUTPUT_EXACT("#if 0\nfalse\n#else\nother\n#endif\n", "other\n");
|
||||
|
||||
// if + elif + else
|
||||
CHECK_PP_OUTPUT_EXACT("#if 0\nzero\n#elif 1\none\n#else\nother\n#endif\n",
|
||||
"one\n");
|
||||
CHECK_PP_OUTPUT_EXACT("#if 0\nzero\n#elif 0\none\n#else\nother\n#endif\n",
|
||||
"other\n");
|
||||
CHECK_PP_OUTPUT_EXACT("#if 1\nfirst\n#elif 1\nsecond\n#endif\n", "first\n");
|
||||
|
||||
// 嵌套
|
||||
CHECK_PP_OUTPUT_EXACT(
|
||||
"#if 1\n #if 0\n inner\n #endif\n outer\n#endif\n", " outer\n");
|
||||
CHECK_PP_OUTPUT_EXACT("#if 0\n #if 1\n inner\n #endif\n "
|
||||
"outer\n#else\n alternative\n#endif\n",
|
||||
" alternative\n");
|
||||
|
||||
// 与 #ifdef 混合
|
||||
CHECK_PP_OUTPUT_EXACT("#define FOO\n"
|
||||
"#if 1\n"
|
||||
" #ifdef FOO\n"
|
||||
" foo\n"
|
||||
" #endif\n"
|
||||
" bar\n"
|
||||
"#endif\n",
|
||||
" foo\n bar\n");
|
||||
}
|
||||
|
||||
static void test_variadic_macros(void) {
|
||||
TEST_CASE("variadic macros with __VA_ARGS__");
|
||||
|
||||
// 基本可变参数宏
|
||||
CHECK_PP_OUTPUT_EXACT("#define FOO(x, ...) x __VA_ARGS__\n"
|
||||
"FOO(1, 2, 3)\n",
|
||||
"1 2, 3\n");
|
||||
|
||||
// 多参数
|
||||
CHECK_PP_OUTPUT_EXACT("#define SUM(...) (__VA_ARGS__)\n"
|
||||
"SUM(1, 2, 3)\n",
|
||||
"(1, 2, 3)\n");
|
||||
|
||||
// 与 printf 结合
|
||||
CHECK_PP_OUTPUT_EXACT("#define DEBUG(fmt, ...) printf(fmt, __VA_ARGS__)\n"
|
||||
"DEBUG(\"hello\", 1, 2)\n",
|
||||
"printf(\"hello\", 1, 2)\n");
|
||||
|
||||
// 空可变参数
|
||||
CHECK_PP_OUTPUT_EXACT("#define FOO(x, ...) x __VA_ARGS__\n"
|
||||
"FOO(1)\n",
|
||||
"1 \n");
|
||||
}
|
||||
|
||||
#define TEST_LIST_CASE(func_name) {#func_name, func_name}
|
||||
TEST_LIST = {
|
||||
TEST_LIST_CASE(test_define_simple_no_macro),
|
||||
@@ -363,5 +421,7 @@ TEST_LIST = {
|
||||
TEST_LIST_CASE(test_undef_macros),
|
||||
TEST_LIST_CASE(hard_test_define_func_macros),
|
||||
TEST_LIST_CASE(test_conditional_ifdef),
|
||||
TEST_LIST_CASE(test_simple_number_conditional_if),
|
||||
TEST_LIST_CASE(test_variadic_macros),
|
||||
{NULL, NULL},
|
||||
};
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user