Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C+中使用C名称+; 我必须让C++函数名在开发环境(keil uVisual)中从C++应用程序中看到。不幸的是,显示的名字仍然使用C++名称。因此,系统显示的不是Task1,而是\u Z5Task1Pv < C++ >我调用< /P> { ... threadDef->pthread = (void (*)(void const*))getTaskID(tfunc); ... threadId = osThreadCreate(threadDef, param); }_C++_C - Fatal编程技术网

在C+中使用C名称+; 我必须让C++函数名在开发环境(keil uVisual)中从C++应用程序中看到。不幸的是,显示的名字仍然使用C++名称。因此,系统显示的不是Task1,而是\u Z5Task1Pv < C++ >我调用< /P> { ... threadDef->pthread = (void (*)(void const*))getTaskID(tfunc); ... threadId = osThreadCreate(threadDef, param); }

在C+中使用C名称+; 我必须让C++函数名在开发环境(keil uVisual)中从C++应用程序中看到。不幸的是,显示的名字仍然使用C++名称。因此,系统显示的不是Task1,而是\u Z5Task1Pv < C++ >我调用< /P> { ... threadDef->pthread = (void (*)(void const*))getTaskID(tfunc); ... threadId = osThreadCreate(threadDef, param); },c++,c,C++,C,然后在一个C文件中 extern "C" { ... typedef void (*TaskFct)(void*); ... static void Task1(void* param) { ... } ... static TaskFct getTaskID(TaskFct tFunc) { ... return Task1; } } P>是否可以在C++应用程序中获得纯C名称?< /P> < P>,如注释所述,“代码

然后在一个C文件中

extern "C" {
    ...
    typedef void (*TaskFct)(void*);
    ...
    static void Task1(void* param) { ... }
    ...
    static TaskFct getTaskID(TaskFct tFunc) {
    ...
    return Task1;
    }
}

<> P>是否可以在C++应用程序中获得纯C名称?< /P> < P>,如注释所述,“代码>外部”C”{}} /代码>被C++编译器用于防止名称的篡改(或至少C++名称的修改)。我现在有一个安装程序,在这里我有一个C++编写的用户空间“驱动程序”和一些静态连接的C++应用程序。我使用gcc构建
MyCDriver.o
文件,然后使用g++构建
cpp
应用程序和驱动程序中的链接。在每个
cpp
类的顶部,我想调用我拥有的驱动程序函数

 extern "C"
 {
   #include "MyCDriverHeader.h"
 }
然后编译
cpp
应用程序:

 g++ -o MyCppApp MyCppApp.cpp MyCDriver.o

与头文件中的类似:

#ifdef __cplusplus
    extern "C" {
#endif
...
#ifdef __cplusplus
    }
#endif

如果在C文件中有
extern“C”
,则表示您做了一些非常错误的事情。@i可以看出您错了。GCC关注扩展。(虽然您将不得不在C++标准库实现中链接,以获得通过链接器的结果)。此外,C没有名称混乱。@IInspectable:对,这正是我的观点。尽管调用了代码> GCC < /代码>而不是<代码> G++<代码>(并且两者都是称为“GCC”的软件的一部分),但执行程序已经发现了扩展名<>代码> CPP < /C>,并通过C++前端而不是C前端传递了代码。所以你自信地说扩展没有任何意义,这完全是胡说八道。@I不可检测我在这一点上很轻松-几乎我使用过的每个编译器都以不同的方式处理.c和.cpp-这是否是OP问题的原因是另一回事matter@IInspectable问题是,您是说或强烈暗示OP使用的任何编译器都会忽略文件扩展名。LRIO正确地给出了一个真正常用的编译器前端示例,它不忽略文件扩展名。如果这并没有使你想表达的观点无效,你需要更清楚地解释你自己,因为我完全不知道你的评论还有什么意思。这里的典型模式是将
extern“C”
直接放在标题中,在
\ifdef\uucplusplus
@MatteoItalia中,这是正确的,但是,我不喜欢这种模式。我将
c
c++
代码分开
c
没有
c++
的概念,也不应该有。如果
c++
想要使用
c
代码,那么包含/兼容的负担应该留给
c++
代码。如果10年后出现了一些很酷的新的
c+2
语言,我是否应该现在就开始在我的
c
代码中添加两个
防护?此外,我可以查看我的
#在我的
c++
代码中包含
s,并根据
外部“c”
打开头文件立即知道什么是
c++
,什么是
c
。。不管怎么说,这是我的少数意见。