在C库中以一致的方式处理错误处理错误时,您认为"最佳实践"是什么?
我一直在考虑两种方式:
始终返回错误代码.典型的功能如下所示:
MYAPI_ERROR getObjectSize(MYAPIHandle h, int* returnedSize);
Run Code Online (Sandbox Code Playgroud)
始终提供错误指针方法:
int getObjectSize(MYAPIHandle h, MYAPI_ERROR* returnedError);
Run Code Online (Sandbox Code Playgroud)
使用第一种方法时,可以编写这样的代码,其中错误处理检查直接放在函数调用上:
int size;
if(getObjectSize(h, &size) != MYAPI_SUCCESS) {
// Error handling
}
Run Code Online (Sandbox Code Playgroud)
这看起来比错误处理代码更好.
MYAPIError error;
int size;
size = getObjectSize(h, &error);
if(error != MYAPI_SUCCESS) {
// Error handling
}
Run Code Online (Sandbox Code Playgroud)
但是,我认为使用返回值返回数据会使代码更具可读性.很明显,在第二个示例中,某些内容被写入了size变量.
您对我为什么应该选择这些方法或者将它们混合或使用其他方法有任何想法吗?我不是全局错误状态的粉丝,因为它往往会使库的多线程使用更加痛苦.
编辑:只要他们不涉及异常,C++关于此的具体想法也会很有趣,因为目前我不能选择...
在Visual Studio(我的情况下是2005)中调试程序时,有一件事让我感到恼火的是,当我使用"跳过"(通过按下F10)执行到下一行代码时,我经常最终到达特定的代码行一个完全不同于我所看到的线程.这意味着我所做的所有背景都丢失了.
我该如何解决这个问题?
如果在Visual Studio的更高版本中可以这样做,我也想听听它.
在下一行代码中设置一个断点,它有一个条件只能为这个线程打破,这不是我正在寻找的答案,因为这对我来说太有用了:)
c++ debugging multithreading visual-studio-2005 visual-studio
我正在构建一个分布式C++应用程序,它需要对在不同进程和计算机之间传递的简单数据结构进行大量序列化和反序列化.
我对序列化复杂的类层次结构不感兴趣,但更多的是使用一些简单的成员(如数字,字符串和数据向量)发送结构.数据向量通常可以是几兆字节.我担心基于text/xml的方法做得太慢而且我真的不想自己写这个,因为字符串编码和数字字节序等问题会使它比表面看起来更复杂.
我一直在寻找协议缓冲区和boost.serialize.根据文件协议缓冲似乎很关心性能.Boost似乎更轻量级,因为你没有外部语言来指定我觉得这个特定项目非常方便的数据格式.
所以我的问题归结为:有人知道上面描述的典型用例的升压序列化是否很快?
此外,如果有其他图书馆可能适合这一点,我会很高兴听到他们.
我正在尝试使用Go的反射系统来检索函数的名称,但是在调用其类型的Name方法时我得到一个空字符串.这是预期的行为吗?
这是我如何处理问题的一个简单示例:
package main
import "fmt"
import "reflect"
func main() {
typ := reflect.TypeOf(main)
name := typ.Name()
fmt.Println("Name of function" + name)
}
Run Code Online (Sandbox Code Playgroud) 在C++中创建公共头文件时,您认为最佳做法是什么?
头文件是否应该包含没有,简短或大量的文档?我已经看到了一切,从几乎没有文档(依靠一些外部文档),以大规格不变,有效参数,返回值等我不知道正是我喜欢的,大的文件是好的,因为你一直访问它从你的编辑器中,另一方面以非常简短的文档,头文件往往可以显示在文本给人什么是可能与类做一个更好的概述的一个或两个页面的完整接口.
假设我选择简短或大量的文档.我想要类似于javadoc的东西,其中我记录了返回值,参数等.在c ++中,最好的约定是什么?据我所知,doxygen在java doc风格的文档中做得很好,但在使用javadoc样式文档之前,我是否应该注意其他任何约定和工具?
我在Windows下的性能关键C++代码中使用了很多STL.获得一些额外性能的一种可能的"廉价"方式是改为更快的STL库.
根据这篇文章, STLport更快,使用更少的内存,但它已经有几年了.
最近有人做过这个改变,你的结果是什么?
我正在创建一个隐藏DLL文件中的某些功能的C api.
由于内部的所有内容都是C++,因此大多数函数都可以处理直接映射到API内部的指针的句柄.
为了获得这些句柄的某种程度的类型安全性,我将它们定义为:
typedef struct MyType1* MyType1Handle;
typedef struct MyType2* MyType2Handle;
Run Code Online (Sandbox Code Playgroud)
我实际上并没有在任何地方定义MyType1或MyType2,因为我只将它们用作指针,并在api内部对实际指针类型进行类型转换.
我的问题是,当我在Visual Studio的clr项目中使用我的库时,我得到了这个 warning: unresolved typeref token (token) for 'type'; image may not run.
http://msdn.microsoft.com/en-us/library/h8027ys9(VS.80).aspx
它起作用并没什么大不了的,但看起来不专业.
我不喜欢使用void*:
typedef void* MyType1Handle;
typedef void* MyType2Handle;
Run Code Online (Sandbox Code Playgroud)
这使得可以调用想要MyType1Handle和MyType2Handle的函数,因为它们实际上是相同的类型.
我不想使用的另一种方法是这样的
typedef int MyType1Handle;
typedef int MyType2Handle;
Run Code Online (Sandbox Code Playgroud)
只要int和指针具有相同的大小,这就可以正常工作,但情况并非总是如此,似乎没有万无一失的方法来获得特定于平台的指针大小整数.它也具有与void*相同的类型安全问题.
我尝试的另一种方法是这样做:
struct MyType1{};
typedef struct MyType1* MyType1Handle;
Run Code Online (Sandbox Code Playgroud)
这在C中不起作用,因为空结构是无效的C代码.我当然可以用虚拟成员扩展我的结构,但似乎应该有更好的方法来做到这一点.
所以我的问题归结为:
你如何以最兼容的方式指定这种类型?
我正在为用C++编写的一些功能开发一个C api,我想确保没有任何异常从任何导出的C函数中传播出来.
这样做的简单方法是确保每个导出的函数都包含在:
try {
// Do the actual code
} catch (...) {
return ERROR_UNHANDLED_EXCEPTION;
}
Run Code Online (Sandbox Code Playgroud)
假设我知道在C++代码中经常遗漏的一个异常是std :: bad_alloc,我想特别对待它我会写这样的东西:
try {
// Run the actual code
} catch (std::bad_alloc& e) {
return ERROR_BAD_ALLOC;
} catch (...) {
return ERROR_UNHANDLED_EXCEPTION;
}
Run Code Online (Sandbox Code Playgroud)
是否有可能以一种巧妙的方式对其进行分解,以便我能够以不同的方式全局处理某些错误而无需为每个导出函数添加新的catch语句用于异常处理程序?
我知道使用预处理器可以解决这个问题,但在走这条路之前,我确保没有其他方法可以做到这一点.
我正在尝试设置boost的子集并使用bjam正确编译,但是我没有得到我正在寻找的结果.我正在使用boost 1.37.0开发Windows.
假设我想要建立/安装库smart_ptr和filesystem.我有意选择了一个只有头文件库和一个需要编译库的库.我希望它们被构建到一个类似于我可以获得的目录结构中,如果我使用bjam构建一个完整的boost安装(即没有指定任何--with-libraryX)但当然没有我不感兴趣的所有库.
我的第一种方法是在bjam中使用--with-filesystem --with-smart_ptr,但它似乎无法识别smart_ptr(我试过smartptr和smart-ptr但没有成功).我想这是因为它只是一个标题库.
当我删除它并且只有--with-filesystem时,它似乎将所有库头文件复制到安装路径,并且只为文件系统构建库.库构建行为是我所希望的,但是我在我的boost目录中安装了大量我不感兴趣的库的头文件.
我的第二种方法是使用bcp来复制相关项目.这确实是因为我只得到了我关心的项目(及其依赖项).但是,他们没有提供任何make文件来构建复制的库.这意味着我需要为所有不是标题的库设置项目文件并手动构建它们.
所以我的问题基本上是,有没有一种选择性构建boost的方法,只复制我感兴趣的库的头文件,只为我感兴趣的非头文件库构建库文件(以及它们的boost库)依赖于课程)?
可能有很多基于手动/脚本的解决方案,但是如果我能够使用bjam运行对我来说会更有用,因为添加新库或升级到新的boost版本会非常简单.
编辑:为第一种方法添加了完整的命令行:
bjam install --prefix=c:\temp\boostsmall
--build-dir=C:\temp\boostsmalltemp --layout=system
--with-filesystem variant=debug link=static threading=multi
runtime-link=static
Run Code Online (Sandbox Code Playgroud)
将scoped_ptr更改为smart_ptr
我试图想出一种在visual c ++(2005)中全局覆盖malloc和相关函数的方法.我的设置是一个带有静态链接的运行时库的DLL,它包含我自己的c ++代码,外部c ++和c代码.我想要完成的是允许dll的用户设置他们自己的内存分配函数的实现.
我不能使用的解决方案:
我不关心的事情
我能想出的最合理的解决方案是以某种方式干扰链接过程并确保我自己的malloc被链接而不是标准的,最好是我希望能够使用旧的malloc函数作为默认值.
在谷歌性能工具中,似乎他们在运行时手动修补函数的代码,以允许在调用原始函数之前调用钩子函数.这真的是最好的方法吗?
c++ ×8
c ×5
boost ×2
performance ×2
windows ×2
api ×1
bjam ×1
debugging ×1
go ×1
go-reflect ×1
javadoc ×1
malloc ×1
overriding ×1
reflection ×1
stl ×1