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.

[参考译文] 编译器/TMS320F2.8335万:从头文件中删除外部"C"后重新定义的stido.h函数的编译错误

Guru**** 2606725 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/633409/compiler-tms320f28335-compilation-errors-of-redefined-stido-h-functions-after-removing-extern-c-from-header-files

部件号:TMS320F2.8335万

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

您好,

由于我正在将所有代码编译为c++,因此我决定从所有项目头文件中删除所有外部"C"声明。

这样做之后,编译器开始给我提供一些关于重新定义的函数fgetc,fputc和sscanf的错误。

#20标识符"sscanf"未定义.... C/C++问题
表观调用括号前的#110表达式必须具有(指向-的指针)函数类型... C/C++问题
#161声明与以前的"std::fgetc"(在“C:\ti/ccs6_2_0/ccsv6/tools/compiler/c2000_scn_stdio.3.ls/include/stdio.h"的第224行声明15.12)不兼容... C/C++问题
#20标识符“file”未定义... C/C++问题
#310函数"fputc"的多个实例与参数列表匹配:... C/C++问题
#760"file"不是类型名称...... C/C++问题

我重命名了fgetc和fputc函数以匹配stido.h中的原型(如下所示),但sscanf仍未定义。

int   fgetc (register std::file *_fp);

int   fputc (int _c,register std::file *_fp);

是否真的有必要使用上述函数原型?

我似乎做错了事。  我使用了cstdio而不是stdio.h,但编译器仍包含stdio.h   

是否有人能向我指出正确的方向,说明如何重新定义上述函数,同时仍然使用C++?

谢谢!

斯蒂芬

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

    我很困惑。  是否要修改编译器RTS头文件(如stdio.h)?  这不受支持。  现在,我假定您只修改自己的源文件。

    请选择一个问题源文件并根据 How to Submit a Compiler Test Case中的说明进行测试。 但请再提交一个文件。  也可以使用选项 --gen_preprocessor_listing.生成相同的文件。  这将创建扩展名为.RL的商品信息文件。  将文件扩展名.txt添加到其中,并将其附加到下一个论坛帖子中。

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    C++标准将C库函数定义为extern "C"。 例如,没有C++链接版本的fgetc。 您绝对必须在C++继承的C函数的每个声明上都有extern "C"。 正如George所指出的,通常不应以任何方式修改TI RTS标头。

    如果您的程序在将函数声明为extern "C"时工作,为什么需要更改它?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我很困惑。  是否要修改编译器RTS头文件(如stdio.h)?  这不受支持。  现在,我假定您只修改自己的源文件。

    不,我只更改项目文件夹中的文件。stdio.h包含在编译器文件夹中。

    请选择一个问题源文件并根据How to Submit a Compiler Test Case中的说明进行测试。  但请再提交一个文件。  也可以使用选项--gen_preprocessor_listing.生成相同的文件。  这将创建扩展名为.RL的商品信息文件。  将文件扩展名.txt添加到其中,并将其附加到下一个论坛帖子中。

    我目前没有访问代码的权限,因此我创建了一个突出显示问题的测试项目。  在创建测试项目时,我意识到需要使用 “使用namespace std”来消除某些编译器错误。  我不知道为什么编译器现在能够找到sscanf()。

    请参阅随附的测试项目。   

    e2e.ti.com/.../TestProject1.zip

    斯蒂芬

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Code Composer存在一个问题,导致索引器无法在 #ifdef __cplusplus中进行索引... #endif。

    请访问 e2e.ti.com/.../144.0314万
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否有办法解决此问题而不必使用外部"C",即可能是C++标准函数?

    当我回到办公桌时,我会尝试你提到的内容。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗯... 在extern "C"语句中查找\#include指令。 对于C标准头文件(例如stdio.h),不需要用外部"C"包装它们。 如果这发生在您没有访问权限的头文件中,请尝试先将头文件包含在源文件的顶部,然后在任何外部"C"之前或使用语句。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以使用std::cout,但这会带来大量的库成本。 对于任何标准C函数,确实需要extern "C"声明。

    好的,您可能想从您自己的代码中删除外部"C",但您是否可以将其保留用于标准C函数? 我认为您真的不需要对它们进行索引?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    看看你的测试案例,我现在看到你在做什么:你真的在重新定义fgetc。  您必须将此函数定义为C函数。  您可以使用extern "C"执行此操作,但我建议将其移动到另一个要编译为C文件的文件中,因此您不需要extern "C",索引程序仍将工作。

    注意:cstdio和stdio.h之间的主要区别是,当您包含stdio.h时,这些函数将被导入到全局命名空间。  如果包含cstdio,则需要将这些函数引用为std::fgetc,或使用Using语句,例如“using std::fgetc;”或“using namespace std;”

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

    好的,这可以消除很多混乱。 回到办公桌后,我会再试一次,并与您一起讨论我最终决定做的事情。

    谢谢!
    斯蒂芬

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

    您对图书馆的巨额费用肯定是正确的。 下面显示的简单程序总共占用 了9.093万个内存字,其中7.99万个在文本部分。

    返回我的问题:

    fgetc()和fputc()正在调用c++驱动程序函数。  当我编译包含fgetc和fputs的文件时,编译器抱怨找不到c++驱动程序函数。

    我没有将c++驱动程序头文件放在外部"C"声明中,因此fgetc和fputc函数应该调用名称“已损坏的c++驱动程序函数”。  

    我做错了什么?

    斯蒂芬

    #include <iostream>
    
    
    int main(void){
    	
    	返回0;
    } 

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

    正常的fgetc和fputc函数不调用任何C++函数。 他们调用C函数,一直到CIO界面。  替换函数也不应调用任何C++函数。

    您说"编译器抱怨找不到c++驱动程序函数。" 该函数的名称是什么? 编译器中的错误的确切文本是什么?

    您需要两个文件,main.cpp和myfputs.c,如下所示:

    /* main.cpp */
    #include <stdio.h>
    
    int main()
    {
    fputs("I am a call to fputs");
    } 

    请注意,由于我已包含stdiio.h,因此可以调用fputs而不使用std:

    /* myfputs.c */
    #include <stdio.h>
    
    int fputs (const char *s,file *stream)
    {
    /*您的实施*/
    }
    

    请注意,因为这是C文件,所以我只需包含stdio.h,就可以获得正确的fputs原型。

    除非要使用std::cout,否则不要包括<iostream。 它不会以任何方式更改程序,但允许您使用std::cout。  如果要使用任何C输出函数(例如printf,puts,putchar),请包括stdio.h或cstdio