我正在构建一个c语言应用程序,使用ARM7.40的IAR嵌入式工作台。
我使用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"
...

观看标准:
#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
我错过了什么?
更新,由于评论:
这个问题不适合新手,因为有标记的答案可以暗示。
这个问题出现在任何最小的hello world示例上,只需添加#include <stdarg.h>,甚至不用它!
preprocess命令是常规build命令的复制粘贴,添加了--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只是一个存根文件。varargs机器内置在编译器中,并由#include <stdarg.h>指令激活这也是为什么在使用--preprocess命令行选项时不展开include指令的原因。这是最近更改的,从iccarm 8.40开始,编译器使用文件系统中的stdarg.h

关于c - IAR嵌入式工作台:stdarg.h尚未预处理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57484313/

10-12 18:04