在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++函数名在开发环境(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>,如注释所述,“代码
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
。。不管怎么说,这是我的少数意见。