我正在寻找一种方法来提取我的代码中使用的所有预处理器符号.
例如,如果我的代码如下所示:
#ifdef FOO
#endif
#if ( BAR == 1 && \
defined (Z) )
#endif
Run Code Online (Sandbox Code Playgroud)
我想把列表[FOO,BAR,Z]作为输出.
我发现了一些帖子gcc -E -dM,但这会显示预处理器将应用于代码的所有符号.
相反,我想要的是代码中实际使用的所有符号的列表.
有什么建议?
我必须将一些用ADA编写的遗留软件从Windows移植到Linux.程序编译正常,但在执行时以分段错误终止.
当程序试图打开文件(文件存在;)时发生段错误.奇怪的是,该程序成功地在执行早期打开另一个文件而没有错误.两个文件都是二进制文件.
使用gdb逐步执行程序,我可以追踪执行的最后一行
DIO.Open (FP (File), To_FCB (Mode), Name, Form);
Run Code Online (Sandbox Code Playgroud)
它在a-direio.adb第167行中定义.
如何进一步调查故障原因?DIO.Open的参数值看起来没问题(它们与上一次成功调用DIO.Open相同,但文件名除外).任何提示都表示赞赏.
这是最终调用DIO.Open的代码:
procedure Open
(The_File : in out File_Type;
The_Mode : in A_DB_Mode := DBS_Database_Types.InOut_DB;
The_Name : in String;
The_Form : in String := "") is
begin
Ada_File_IO.Open
(File => The_File,
Mode => DB_Mode_To_File_Mode(The_Mode),
Name => The_Name,
Form => The_Form);
exception
when Ada_File_IO.Status_Error => raise Status_Error;
when Ada_File_IO.Name_Error => raise Name_Error;
when Ada_File_IO.Use_Error => raise Use_Error;
end Open;
Run Code Online (Sandbox Code Playgroud)
其中ADA_File_IO声明为
package …Run Code Online (Sandbox Code Playgroud)