抱歉,这个问题需要解释一下。我正在修复 doxygen 解析一些 C++ 代码时的疏忽,我遇到了一个 doxygen 没有考虑的不寻常的极端情况。我有一个修复程序,但我想让它更通用,所以我需要一些解释。
为了说明 doxygen 失败的情况,我将定义一个涉及辛普森一家的人为示例(因为这似乎很适合这类问题)。假设我们有以下枚举:
enum simpson { HOMER, MARGE, BART, LISA, MAGGIE };
现在我们想将枚举值传递给一个方法(自然属于 Simpsons 类),如下所示:
const char* voicedBy(simpson simpson)
{
switch (simpson) {
case HOMER:
return "Dan Castellaneta";
case MARGE:
return "Julie Kavner";
case BART:
return "Nancy Cartwright";
case LISA:
return "Yeardley Smith";
case MAGGIE:
return "*suck* *suck*";
}
}
不幸的是,这会产生编译器错误,因为枚举类型“simpson”不允许与参数名称“simpson”相同(与 C# 不同)。但是,C++ 对此有一个答案。您将 enum 关键字放在类型名称的前面,如下所示:
const char* voicedBy(enum simpson simpson)
现在代码将编译并运行。不幸的是,doxygen 没有考虑这种情况,因此它将整个字符串“enum simpson simpson”视为没有参数名称的参数类型。我想出了一些代码来修复像上面这样的枚举的 doxygen。
我的问题是,这种技巧还适用于哪些其他类型? struct?,union?,typedef?,其他?就此而言,“与参数名称同名的方法参数的类型说明符”概念是否有一个名称,以便我可以获得更多详细信息?
最佳答案
您使用的是什么编译器和版本?
void foo( simpson simpson ) {}
不存在 enum,也就是说,您不需要在此上下文中使用详细的类型说明符,并且它可以在 gcc 4.2 和 4.6 中完美编译。问题是在函数中,参数名称隐藏了*类型,如果你想在内部声明一个具有该类型的新变量该范围您将需要详细的类型说明符,但在函数签名中它是从左到右解析的,这意味着第一个 simpson 是枚举,此时没有冲突。第二个 simpson 引入了一个本地名称,从那里开始,simpson 指的是参数而不是类型。
void relationship( /*enum*/ simpson simpson, enum simpson other = HOMER );
// ^^^^ optional ^^^^ required
{
enum simpson yet_another = simpson;
// ^^^^ required ^^^^^^^ first argument!
}
如果您定义一个与您想要的类型具有相同名称的函数,则可能会发生相同类型的名称隐藏:
void simpson();
void voicedBy( enum simpson s );
// ^^^^ required
请注意,如果您添加 typedef,最后一种情况会发生一些变化:typedef 名称和函数名称(或同一作用域中的变量名称)之间会发生名称冲突。
* 这里hides不是在一个作用域中的变量的意义上使用,在外部作用域中隐藏具有相同名称的变量。在 C++ 中,与在 C 中一样,有两个标识符空间,一个用于用户定义的类型,另一个用于大多数其他所有内容,包括 typedef-ed 类型别名。 C++中的查找是从内部作用域到外部作用域进行的,在每个作用域中搜索全局标识符空间,如果没有找到标识符,则在用户定义类型标识符空间中搜索相同的标识符。最后一步不在 C 中执行,在 C 中始终需要详细的类型说明符。只有当这也失败时,编译器才会移动到下一个范围。
关于C++ 对于哪些类型,参数类型名称可以与带类型说明符的参数名称相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6092220/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)