我正在构建一种可以编译为 C 或 C++ 的小语言,我还没有决定,但是我遇到了关于 #include 的两难选择。关键字。
我的语言将带有一个标准库,该库将被合并到该语言中,并且可以像 C 或 C++ 一样使用标准库进行访问,例如 #include <string> .
我的编译器可以自动区分用户 包含和标准库 包含,但我的问题在于 GCC 编译器如何使用 -I旗帜。
我们以Java为例。默认包(文件夹)之一称为 java.util .如果我尝试创建自己的名为 java.util 的文件夹在我的项目中,出现错误:
The package java.util conflicts with a package accessible from another module: java.base
表示它默认包含在内。
我希望这在 C++ 中做同样的事情,但我担心用户可能(假设地)做一个相对路径包含并导致冲突。
例如,我这样使用标志:-I ../some/folder .
然而,用户可以简单地输入 #include "../some/folder"访问相同的内容。有什么办法可以限制这一点,就像问题的标题所暗示的那样,“保护” 文件夹不被这样调用?
此外,如果该文件夹中有一个名为 test.h 的文件用户决定创建自己的文件 test.h本地并包含它。冲突将如何发生?它会在包含的 via 上选择本地文件夹吗?旗帜?
基本实现示例如下:(通用语法,无特定语言)
boolean userDefine = false;
string defineName = "foo";
// Do something to determine if <> define or "" define.
if (userDefine) {
// Returns #include "foo"
return "#include \"" + defineName + "\"";
} else {
// Returns #include "stdlib/foo"
return "#include \"stdlib/" + defineName + "\"";
}
但话又说回来,用户可以包含该文件夹,使其满足第一个条件并仍然获得访问权限。
最佳答案
将任何 #include 文件放在 C++ 源文件的开头几乎是标准做法,这是首要任务。
当然,#include 可以出现在 C++ 源文件中的任何位置,并且在某些情况下会发生这种情况,但是,如果您要从 github 中获取一些随机的 C++ 源代码,机会就很大所有 #include 文件都将位于文件的开头。
因此,您所要做的就是安排您的库的 #include 始终位于开头,并使用标准的 #ifndef/#define 守卫在你的头文件中。然后,无论使用什么路径,随后手动包含它们都不会产生任何影响。
当然,这不会阻止任何人手动#undef你的守卫,制造一些困惑。然而,C++ 从来没有可靠地防止你搬起石头砸自己的脚的名声,而且在可预见的 future 也不太可能赢得这样的名声;所以呢?实际上,大多数编译器都实现了#pragma once,这可能是一种稍微好一点的 footer 自拍预防方法......
关于c++ - 保护某些包含位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48582069/
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
如何将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.你能做的最好的事情是:
我需要一个非常简单的字符串验证器来显示第一个符号与所需格式不对应的位置。我想使用正则表达式,但在这种情况下,我必须找到与表达式相对应的字符串停止的位置,但我找不到可以做到这一点的方法。(这一定是一种相当简单的方法……也许没有?)例如,如果我有正则表达式:/^Q+E+R+$/带字符串:"QQQQEEE2ER"期望的结果应该是7 最佳答案 一个想法:你可以做的是标记你的模式并用可选的嵌套捕获组编写它:^(Q+(E+(R+($)?)?)?)?然后你只需要计算你获得的捕获组的数量就可以知道正则表达式引擎在模式中停止的位置,你可以确定匹配结束
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我的Gallery模型中有以下查询:media_items.includes(:photo,:video).rank(:position_in_gallery)我的图库模型有_许多媒体项,每个都有一个照片或视频关联。到目前为止,一切正常。它返回所有media_items包括它们的photo或video关联,由media_item的position_in_gallery属性排序。但是我现在需要将此查询返回的照片限制为仅具有is_processing属性的照片,即nil。是否可以进行相同的查询,但条件是返回的照片等同于:.where(photo:'photo.is_processingIS
-if!request.path_info.include?'A'%{:id=>'A'}"Text"-else"Text"“文本”写了两次。我怎样才能只写一次并同时检查path_info是否包含“A”? 最佳答案 有两种方法可以做到这一点。使用部分,或使用content_forblock:如果“文本”较长,或者是一个重要的子树,您可以将其提取到一个部分。这会使您的代码变干一点。在给出的示例中,这似乎有点矫枉过正。在这种情况下更好的方法是使用content_forblock,如下所示:-if!request.path_info.inc
Ocra无法处理需要“tk”的应用程序require'tk'puts'nope'用奥克拉http://github.com/larsch/ocra不起作用(如链接中的一个问题所述)问题:https://github.com/larsch/ocra/issues/29(Ocra是1.9的"new"rubyscript2exe,本质上它用于将rb脚本部署为可执行文件)唯一的问题似乎是缺少tcl的DLL文件我不认为这是一个问题据我所知,问题是缺少tk的DLL文件如果它们是已知的,则可以在执行ocra时将它们包括在内有没有办法知道tk工作所需的DLL依赖项? 最佳答