This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/TMS570LS0432:使用宏时出现编译错误

Guru**** 2117280 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/595946/compiler-tms570ls0432-compilation-error-using-macros

部件号:TMS570LS0432

工具/软件:TI C/C++编译器

以下代码不能使用TI ARM编译器17.3 v.0.STS或TI 5.2 v.8进行编译。  我没有尝试过其他版本。

// test.c

int getVal(void){返回0;}

int wuld_compiled(void){; int RetVal = getVal();返回0;}#define

me_func( funname ) int funname(void){; int Retmk = getVal }();返回0;

int me_func(wo_compile)

// TI ARM编译器具有以下


源代码/命令:/name/subdir/:编译/失败: 目标'source/test.obj'失败
//"../source/test.c",第9行:警告#994-D:在非void函数"wo_compile "//
"../source/test.c"的末尾缺少返回语句,第9行:错误#68:预期a "}"//
"./source/test.c",第
9行:错误:错误代码:#171。 应为声明
//"../source/test.c",第9行:错误#171:应为声明
//源末尾:警告#12-D:编译
"../source/test.c"时检测到前面的语法错误// 4个错误后,解析在此处重新启动。
// gmake:***[source/test.obj]错误1.

以下是预处理输出:

int getVal (void){返回0;}

int wd_compile (void){; int RetVal = getVal ();返回0;}


int wo_compile (void){; int RetVal = getVal ();返回0;}

如果将文件另存为.c文件,则预处理的输出只编译文件。

--谢谢

test.c:

e2e.ti.com/.../6735.test.c

test.pp.c:

e2e.ti.com/.../test.pp.c

请注意,论坛界面不允许我上载".pp"文件,因此我已将其重命名为".pp.c"文件,但除了重命名,该文件与预处理程序创建的文件完全相同。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您通知我们此问题。  我可以复制它。  我在 SDOWP系统中提交了CodeGen-2259,以对此进行调查。  欢迎您使用我签名中下面的SDOWP链接进行关注。

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我相信这是已知问题CodeGen-1979。 如果源代码在声明("int RetVal = getVal ();")之前有一个语句(";"),并且声明前面没有空格,则解析器将发出不正确的错误("error: Expected a "}")。 当您将这样的代码放入预处理程序时,它会去除所有非打印字符,因此即使宏中实际上有一个空格,解析器开始工作时也没有空格。 您需要重新排列宏,以便在任何声明之前都没有语句。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当我尝试使用George签名的SDOWP链接中的搜索框时,我收到"未找到记录'CodeGen-1979'。 此问题的状态和要修复的时间是什么?

    请注意,.pp输出文件在“;”和int声明之间确实有一个空格,如我上面所示。 这意味着.pp输出不能准确反映编译器内部正在执行的操作;您是否同意?

    --谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已将CodeGen-1979更新为公开。 SDOWP应尽快刷新。

    确实,.pp输出与正常编译不是完全相同的错误处理输出。 但是,它是由同一解析器生成的,因此非常接近。 除了这个特别的错误之外,我不记得另一个有实际的,非病理差异的情况。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    公平地说,这里似乎值得指出的是,这里可能有两个不同的错误,一个是解析器在处理宏时没有执行添加空间的内部等效操作,而不是CodeGen-1979关于声明旁边的空白的问题。

    或者,在它们的保护下,它们毕竟是同一个虫子。


    关于此问题对我们的影响的一条评论:

    我感谢有消息表明,我们有一个解决这一问题的杠杆,可以重新排列我们的申报顺序。 这当然很有价值,但就我们的流程而言,这并不是免费的,因为我们有与变量声明相关的编码标准。 它特别影响我们要声明为const的变量。

    (想象一下上面玩具代码中的"const int RetVal = getVal ();"。)


    SDOWP未显示CodeGen-1979的"目标版本"。 解决这一问题的时限是什么?

    --谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    坦率地说,还没有确定时间框架。 我们仍在讨论我们将要做什么。