我在全新的 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,即使它包含在一个没有在任何地方说 extern "C"的 .cpp 文件中?
有什么想法吗?
编辑:如果我在 #include 中使用完整路径,即 #include "/usr/include/gfc2/macros.h"/p>
EDIT2:它不包括错误的 header 。我已经使用 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/include早于 C++。参见 Preprocessor Output在 CPP 手册中。
现在 G++ 大多忽略了这个提示,因为大多数平台的 C 头文件不再古老。请参阅 GCC 内部手册中的 NO_IMPLICIT_EXTERN_C 目标宏。但可能是这个旧版本的 Xcode 没有配置 GCC NO_IMPLICIT_EXTERN_C,因此正在听取预处理器的提示。 (这是在构建 GCC 本身时设置的——我认为没有命令行开关可以覆盖它。)
您可以通过将头文件的内容包装在 extern "C++" 中来解决这个问题。
关于c++ - 仅当 .h 位于特定目录中时,g++ 才会神秘地失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2328031/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
是否可以在应用程序中包含的gem代码中知道应用程序的Rails文件系统根目录?这是gem来源的示例:moduleMyGemdefself.included(base)putsRails.root#returnnilendendActionController::Base.send:include,MyGem谢谢,抱歉我的英语不好 最佳答案 我发现解决类似问题的解决方案是使用railtie初始化程序包含我的模块。所以,在你的/lib/mygem/railtie.rbmoduleMyGemclassRailtie使用此代码,您的模块将在
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我正在尝试在Rails上安装ruby,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf
在读取/解析文件(使用Ruby)时忽略某些行的最佳方法是什么?我正在尝试仅解析Cucumber.feature文件中的场景,并希望跳过不以Scenario/Given/When/Then/And/But开头的行。下面的代码有效,但它很荒谬,所以我正在寻找一个聪明的解决方案:)File.open(file).each_linedo|line|line.chomp!nextifline.empty?nextifline.include?"#"nextifline.include?"Feature"nextifline.include?"Inorder"nextifline.include?
我需要一个非常简单的字符串验证器来显示第一个符号与所需格式不对应的位置。我想使用正则表达式,但在这种情况下,我必须找到与表达式相对应的字符串停止的位置,但我找不到可以做到这一点的方法。(这一定是一种相当简单的方法……也许没有?)例如,如果我有正则表达式:/^Q+E+R+$/带字符串:"QQQQEEE2ER"期望的结果应该是7 最佳答案 一个想法:你可以做的是标记你的模式并用可选的嵌套捕获组编写它:^(Q+(E+(R+($)?)?)?)?然后你只需要计算你获得的捕获组的数量就可以知道正则表达式引擎在模式中停止的位置,你可以确定匹配结束
在我让另一个人重做我的前端UI之前,我的Rails应用程序运行平稳。我已经尝试解决此错误3天了。这是错误:Nosuchfileordirectory-identifyExtractedsource(aroundline#59):575859606162@post=Post.find(params[:id])authorize@postif@post.update_attributes(post_params)flash[:notice]="Postwasupdated."redirect_to[@topic,@post]else{"utf8"=>"✓","_method"=>"patc
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我