C文件中是否需要外部"C"?(解决奇怪的日食行为)
is extern "C" required in C files ? (to solve odd Eclipse behaviour)
我对使用gcc和g++工具的混合C/c++应用程序比较陌生。为了掌握它,我下载了iperf源代码,并使用Eclipse成功地构建了它。
有一个奇怪的地方:如果我用Eclipse查看"Thread.c"文件,它会认为有语法错误,并在几乎整个文件上加下划线,就好像代码有缺陷一样,但它绝对不是。
这是触发它的一段代码:
#ifdef __cplusplus
extern "C"
{
#endif
我知道extern"C"在c++中用于什么,但是Eclipse在。C文件中出现时存在问题。它很高兴地接受。cpp和。h文件。
我已经检查了Make实用程序如何构建iperf应用程序,我看到它总是使用gcc来编译c文件和g++来编译cpp文件,这让我想知道是否实际上需要extern"c"。它绝对不会造成伤害,因为gcc编译器会愉快地处理它,但如果不是严格要求,我可以省略它,以便在Eclipse中获得更好的可读性。
我也研究了Eclipse行为的一个可能的解决方案,但还没有真正找到一个,如果有人能指出如何解决它,那将是同样好的。
如果您正在使用Eclipse,那么您在编辑器中看到的内容必须与Eclipse内部索引器/解析器有关。您的混合C/c++项目可能没有编译和构建问题,但是当您打开带有
的源文件时#ifdef __cplusplus
extern "C" {
#endif
可能会在外部"C"行看到语法错误。这意味着在项目设置中为C编译器定义了"__cplusplus"符号。
为了消除Eclipse编辑器中的语法错误,转到项目属性-> C/c++通用->路径和符号-> # Symbols选项卡,并在"语言"列下选择"GNU C"(或您使用的任何C编译器)。滚动右边的符号/值列表,找到"__cplusplus"符号并删除它。确保在C编译器中只使用 。
单击OK关闭项目属性窗口,Eclipse编辑器中的语法错误警告将消失。
这段代码通常在头文件中找到,应该总是写在属于c文件的头文件中。
的原因是c在内部调用函数时使用了不同的模式(--> name mangeling)。虽然编译器可以通过扩展名区分c++代码文件和c代码文件,但它不能区分CPP文件中包含的c头文件和c++头文件。因此,它不知道是否必须修改已声明函数的名称(默认情况下是这样做的)。
则链接器尝试将使用的符号(从cpp引用函数)与创建的符号(由c文件定义)相匹配,如果没有告诉编译器不要混淆声明,则不会找到符号。
extern "C"
仅在c++中合法,并确保指定的函数具有C链接。这意味着函数参数不会被分解成二进制函数名。
为了确保头文件可以在C语言中编译,我们包含了#ifdef __cplusplus
, __cplusplus
是由c++编译器而不是C编译器定义的。这个用法用来保护C代码不受c++ only extern "C"
指令的侵害。
IDE不使用编译器的代码智能,因此可能会出错。
可能只是针对您的问题的一个愚蠢的变通方法。我发现,在CPP文件中使用c函数时,理论上需要extern。但是我发现在eclipse氧版本中,我们不需要指定extern c,我们可以直接在cpp文件中使用c函数和printf语句,它工作得很好。
我的解决办法可能不是很有用,但你可以试一试。- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 在设计 SDK 时,我是否应该在 C++ 头文件中完全隐藏内部类?
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 如何将 UTF-8 文本从文件转换为某个可以迭代的容器,并检查每个符号是否为C++字母数字?
- 如何检查函数是否在LLVM Instrumentation pass的ModulePass的系统头文件中定义?
- 是否可以在没有真实文件的情况下创建 ifstream
- 是否可以使用 libclang python 解析 cpp 文件中没有标头的函数原型
- 在C++中使用没有合作伙伴Class/Cpp文件的头文件是否实用
- 是否可以使用 Python csv 阅读器读取使用 C++ std::setw 生成的文件?
- 内联函数的函数本地静态对象是否在共享对象文件之间共享?
- 是否可以在命令行中将输入参数传递给可执行文件
- 在头文件上包含 cpp 文件是否有缺点?
- 如果包含映射的静态库与可执行文件和动态库链接,静态映射(变量)是否会被多次释放?
- 是否可以在文本文件中找到最长单词的长度,并在同一个文本文件中读取,只需 1 个 while 循环?
- 对同一文件使用 .read 的次数是否有限制?
- 如何检查流中文件的下一个单词是否为 alpha?
- 文件模式标志"ios::app"是否用于删除文件(如果文件已存在)?
- 使用 #include 将大量重复代码放入单独的文件中是否可以和/或正常?
- 如何检查文件是否已存在于 fstream C++中
- 是否有正确的方法对生成文件中的对象文件使用模板命令?(C++)