iOS   发布时间:2022-05-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了只有.h在某个目录中时,c-g才会神秘地失败大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我在新的OSX 10.4.11 Xcode 2.5安装中遇到了一个非常奇怪的问题.我把它减少到一个最小的测试用例.这是test.cpp: #include "macros.h" int main (void) { return 1; } 这是macros.h: #ifndef __JUST_TESTinG__ #define __JUST_TESTinG__ template<type
我在新的OSX 10.4.11 Xcode 2.5安装中遇到了一个非常奇怪的问题.我把它减少到一个最小的测试用例.这是test.cpp:

#include "macros.h"

int main (void)
{
    return 1;
}

这是macros.h:

#ifndef __JUST_TESTinG__
#define __JUST_TESTinG__

template<typename T> void swap (T& pT1,T& pT2)
{
    T pTmp = pT1;
    pT1 = pT2;
    pT2 = pTmp;
}

#endif //__JUST_TESTinG__

如果两个文件都在同一目录中,则编译并正常工作.但是,如果我将macros.h放在/usr/include / gfc2(它是我使用的自定义库的一部分)并更改test.cpp中的#include,则编译失败并显示以下错误

/usr/include/gfc2/macros.h:4: error: template with C linkage

我研究了这个错误,大多数评论都指向了一个“悬空的外部C”,这似乎根本就不是这样.

在这里完全失败了.是g出于某种原因假设/usr/include / gfc2中的所有内容都是C,即使它包含在一个.cpp文件中,它不会在任何地方说“ex”?

有任何想法吗?

编辑:如果我使用#include中的完整路径,它会编译,即#include“/usr/include/gfc2/macros.h”

EDIT2:它没有包含错误标题.我已经使用cpp,g -E验证了这一点,并将macros.h重命名为foobarmacros.h

解决方法

G可能确实假设/usr/include中的所有内容都是C.尝试使用-E编译代码并研究预处理器输出中的行标记

g++ -E test.cpp | grep '^#'

你可能会看到类似的东西

# 1 "/usr/include/gfc2/macros.h" 1 3 4

4是预处理器暗示G它应该将所有内容包装在extern“C”中,假设您的平台的/ usr /中的古代头文件包含在前C中.请参阅CPP手册中的Preprocessor Output.

这些天G大多忽略了这个提示,因为大多数平台的C头不再是古老的.请参阅GCc internals手册中的NO_IMPLICIT_EXTERN_C目标宏.但可能是这个旧版本的Xcode配置了没有NO_IMPLICIT_EXTERN_C的GCC,因此正在监听预处理器的提示. (这是在GCC本身构建时设置的 – 我不认为有一个命令行开关来覆盖它.)

您可以通过将头文件内容包装在extern“C”中来解决此问题.

大佬总结

以上是大佬教程为你收集整理的只有.h在某个目录中时,c-g才会神秘地失败全部内容,希望文章能够帮你解决只有.h在某个目录中时,c-g才会神秘地失败所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。