IAR Embedded Workbench: stdarg.h 未预处理
IAR Embedded Workbench: stdarg.h isn't preprocessed
我正在构建一个 c 语言应用程序,使用 IAR Embedded Workbench for ARM 7.40。
我正在使用 libclang 来获取我的 C 代码的 AST(抽象语法树)表示。
为此,我正在预处理我的源代码。
问题出在 #include <stdarg.h>
- 它没有展开 。
原始代码片段:
int before_stdarg = 1;
#include <stdarg.h>
int after_stdarg = 2;
va_list args;
#include "func1.h"
...
预处理代码段:
#line 1 "source\App\func1.c"
int before_stdarg = 1;
#include <stdarg.h>
int after_stdarg = 2;
va_list args;
#line 1 "C:\testAppC\source\App\func1.h"
...
正在查看stdarg.h:
#ifdef __ICCARM__
#error "Reading built-in header-file. If you used upper case, try #include <stdarg.h>"
#endif
第二个问题:va_list
定义在哪里?
注释掉 #include <stdarg.h>
会导致编译错误:Error[Pe020]: identifier "va_list" is undefined
我错过了什么?
更新,由于评论:
Q 不适用于 IAR EWARM 新手,因为标记的答案可以暗示。
该问题发生在任何最小的 hello-world 示例中,只需添加 #include <stdarg.h>
,甚至不使用它!
预处理命令是常规构建命令的复制粘贴,添加 --preprocess=l PATH_TO_PREPROCESSED_OUTPUT_FILE
:
PS C:\testAppC> iccarm.exe source\App\func1.c -DSTM32L476xx -DUSE_HAL_DRIVER -I"C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.2\arm\CMSIS\Include" -I"C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.2\arm\inc\c" -I"source\App" -I"source\Device" --char_is_signed --cpu=Cortex-M4 --debug --dlib_config "C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.2\arm\INC\c\DLib_Config_Normal.h" --endian=little --fpu=None --no_clustering --no_code_motion --no_cse --no_inline --no_scheduling --no_tbaa --no_unroll -On -e -o testAppC\Obj --preprocess=l C:\testAppC\.aurora\tmp\func1.c.i
在 iccarm 7.40 中,文件系统中的 stdarg.h
只是一个存根文件。可变参数机制内置于编译器中并由 #include <stdarg.h>
指令激活。这也是为什么在使用 --preprocess
命令行选项时不扩展此 include 指令的原因。这是最近更改的,从 iccarm 8.40 开始,编译器使用文件系统中的 stdarg.h
。
一般来说,<...>
中指定的 headers 不需要是磁盘上的单独文件,但可以内置到编译器中,并且只需要在编译的预处理阶段扩展 就好像 它们是代码粘贴在 #include
指令的位置。
事实上,标准说 other include 形式 "..."
includes source files,所以标准本身甚至根本不使用术语 "header file" - 只有 headers 或 source files.
我正在构建一个 c 语言应用程序,使用 IAR Embedded Workbench for ARM 7.40。
我正在使用 libclang 来获取我的 C 代码的 AST(抽象语法树)表示。
为此,我正在预处理我的源代码。
问题出在 #include <stdarg.h>
- 它没有展开 。
原始代码片段:
int before_stdarg = 1;
#include <stdarg.h>
int after_stdarg = 2;
va_list args;
#include "func1.h"
...
预处理代码段:
#line 1 "source\App\func1.c"
int before_stdarg = 1;
#include <stdarg.h>
int after_stdarg = 2;
va_list args;
#line 1 "C:\testAppC\source\App\func1.h"
...
正在查看stdarg.h:
#ifdef __ICCARM__
#error "Reading built-in header-file. If you used upper case, try #include <stdarg.h>"
#endif
第二个问题:va_list
定义在哪里?
注释掉 #include <stdarg.h>
会导致编译错误:Error[Pe020]: identifier "va_list" is undefined
我错过了什么?
更新,由于评论:
Q 不适用于 IAR EWARM 新手,因为标记的答案可以暗示。
该问题发生在任何最小的 hello-world 示例中,只需添加 #include <stdarg.h>
,甚至不使用它!
预处理命令是常规构建命令的复制粘贴,添加 --preprocess=l PATH_TO_PREPROCESSED_OUTPUT_FILE
:
PS C:\testAppC> iccarm.exe source\App\func1.c -DSTM32L476xx -DUSE_HAL_DRIVER -I"C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.2\arm\CMSIS\Include" -I"C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.2\arm\inc\c" -I"source\App" -I"source\Device" --char_is_signed --cpu=Cortex-M4 --debug --dlib_config "C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.2\arm\INC\c\DLib_Config_Normal.h" --endian=little --fpu=None --no_clustering --no_code_motion --no_cse --no_inline --no_scheduling --no_tbaa --no_unroll -On -e -o testAppC\Obj --preprocess=l C:\testAppC\.aurora\tmp\func1.c.i
在 iccarm 7.40 中,文件系统中的 stdarg.h
只是一个存根文件。可变参数机制内置于编译器中并由 #include <stdarg.h>
指令激活。这也是为什么在使用 --preprocess
命令行选项时不扩展此 include 指令的原因。这是最近更改的,从 iccarm 8.40 开始,编译器使用文件系统中的 stdarg.h
。
一般来说,<...>
中指定的 headers 不需要是磁盘上的单独文件,但可以内置到编译器中,并且只需要在编译的预处理阶段扩展 就好像 它们是代码粘贴在 #include
指令的位置。
事实上,标准说 other include 形式 "..."
includes source files,所以标准本身甚至根本不使用术语 "header file" - 只有 headers 或 source files.