我有一些我正在使用的C代码,我在代码运行时发现错误,但是关于如何正确执行try/catch(如C#或C++)的信息很少.
例如在C++中,我只是这样做:
try{
//some stuff
}
catch(...)
{
//handle error
}
Run Code Online (Sandbox Code Playgroud)
但在ANSI C中,我有点迷失.我尝试了一些在线搜索,但是我没有看到关于如何实现这一点的足够信息/想象我会问这里以防万一有人能指出我正确的方向.
这是我正在使用的代码(相当简单,递归的方法),并希望用try/catch(或等效的错误处理结构)进行包装.
但是我的主要问题是如何在ANSI C中执行try/catch ...实现/示例不必是递归的.
void getInfo( int offset, myfile::MyItem * item )
{
ll::String myOtherInfo = item->getOtherInfo();
if( myOtherInfo.isNull() )
myOtherInfo = "";
ll::String getOne = "";
myfile::Abc * abc = item->getOrig();
if( abc != NULL )
{
getOne = abc->getOne();
}
for( int i = 0 ; i < offset ; i++ )
{
printf("found: %d", i);
}
if( abc != NULL )
abc->release();
int childCount …Run Code Online (Sandbox Code Playgroud) 我正在阅读关于C/C++ Prototype语句的维基百科,我很困惑:
维基百科说:"通过包含函数原型,您可以通知编译器函数"fac"采用一个整数参数,并使编译器能够捕获这些类型的错误."
并使用以下作为示例:
#include <stdio.h>
/*
* If this prototype is provided, the compiler will catch the error
* in main(). If it is omitted, then the error will go unnoticed.
*/
int fac(int n); /* Prototype */
int main(void) { /* Calling function */
printf("%d\n", fac()); /* ERROR: fac is missing an argument! */
return 0;
}
int fac(int n) { /* Called function */
if (n == 0)
return 1;
else
return n * fac(n - 1); …Run Code Online (Sandbox Code Playgroud) 关于传递指针的工作原理,我有点困惑.
假设我有以下函数和指针,并且......
编辑:
...我想在函数中使用指向某个对象的指针作为参数.
即:
void Fun(int Pointer){
int Fun_Ptr = ---Passed Pointer---;
//So that Fun_Ptr points to whatever ---Passed Pointer points to
Run Code Online (Sandbox Code Playgroud)
在*Pointer和&Pointer符号之间,我很困惑.我知道*指针意味着给它指出的任何东西.
我是否在声明中放入了void(int*pointer).我什么时候使用这个功能?
非常感谢您的协助.
编辑2:
好的,我现在明白在声明中使用*变量意味着将传递指针.但是,当我使用该功能时呢?
即
int main(){
int foo;
int *bar;
bar = foo;
Fun(bar);
}
Run Code Online (Sandbox Code Playgroud)
编辑3: 好的,如果我错了,请纠正我:
根据上述代码的惯例:
bar =&foo表示:使条形指向内存中的foo
*bar = foo表示将条指向的值更改为等于foo等于的值
如果我有第二个指针(int*oof),那么:
bar = oof表示:bar指向oof指针
bar =*oof表示:bar指向oof指向的值,但不指向oof指针本身
*bar =*oof表示:将条指向的值更改为oof指向的值
&bar =&oof表示:更改条指向的内存地址与oof指向的内存地址相同
我有这个权利吗?
编辑4:非常感谢你的帮助(我希望我能接受超过1个答案,但我必须选择第一个答案.我不确定社区维基是如何工作的,但我会这样离开编辑(如果您愿意,可随意将其转换为参考指南).
std::vector<string> names;
std::vector<string>::iterator start = names.begin();
std::vector<string>::iterator end = names.end();
sort (start,end);
//are my start and end valid at this point?
//or they do not point to front and tail resp?
Run Code Online (Sandbox Code Playgroud) 我需要使用C++以编程方式创建快捷方式.
如何使用Win32 SDK执行此操作?
什么API函数可用于此目的?
有时,在使用C++模板进行编码时,您希望阻止用户实例化特定的特化或一组特化,因为结果将是荒谬的.因此,您可以定义(特定或部分)特化,如果实例化,其定义将导致编译器错误.如果用户"误用"模板,目标将是在头文件中的注释旁边引发编译器错误,解释不应该做什么,而不是让编译器自己提出一些令人困惑的错误消息设备,或者可能允许编译可疑代码.
例:
template <typename T> struct MyClassTemplate {
// ...
};
template <typename T> struct MyClassTemplate<T*> {
// Do not use MyClassTemplate with a pointer type!
typedef typename T::intentional_error err;
};
Run Code Online (Sandbox Code Playgroud)
有很多方法可以做到这一点(取决于你的专业化是一个类或函数的完全或部分特化).但是使用的语法必须(?)依赖于模板参数,否则编译器会在首次解析故意错误定义时抱怨.上面的例子有一个漏洞,有人可能会顽固地定义一个intentional_error嵌套类型或成员typedef(虽然我会说他们会因此而得到任何问题).但是,如果你使用的技巧过于花哨,你很可能会得到一个难以理解和/或误导性的编译器错误消息,这大部分都会失败.
是否有更好的直接方法来禁止模板实例化?
我知道在C++ 0x中,模板Concepts和删除的函数声明将更好地控制这类事情,但我正在寻找有效的C++ 03答案.
我觉得这可能与C语法有关,但我用C++开始编程,所以我不确定.
基本上我已经看到了这个:
struct tm t;
memset( &t, 0, sizeof(struct tm) );
Run Code Online (Sandbox Code Playgroud)
我对这种语法有点困惑,因为通常我希望上面的内容看起来像这样:
tm t;
memset( &t, 0, sizeof(tm) );
Run Code Online (Sandbox Code Playgroud)
这两者之间有什么区别,为什么要使用前者呢?
tm我所指的结构是wchar.h,其定义如下:
struct tm {
int tm_sec; /* seconds after the minute - [0,59] */
int tm_min; /* minutes after the hour - [0,59] */
int tm_hour; /* hours since midnight - [0,23] */
int tm_mday; /* day of the month - [1,31] */
int tm_mon; /* months since January - [0,11] */
int tm_year; /* years …Run Code Online (Sandbox Code Playgroud) 我的随机数输出,每次运行我的游戏时以相同的顺序输出.为什么会这样?
我有
#include <cstdlib>
Run Code Online (Sandbox Code Playgroud)
并使用它来生成随机数
randomDiceRollComputer = 1 + rand() % 6;
Run Code Online (Sandbox Code Playgroud) 我想从丢失0包的10Gbps网卡中捕获数据包.我正在使用lipcap用于100Mbps网卡,它工作正常.libpcap能否处理10Gbps网卡流量?如果没有,还有什么其他替代方法可以实现这一目标?
我看到一篇博客帖子使用了非类型的可变参数模板(目前gcc不支持,只有clang支持).
template <class T, size_t... Dimensions>
struct MultiDimArray { /* ... */ };
Run Code Online (Sandbox Code Playgroud)
帖子中的示例编译得很好,但我没能使用函数模板.
任何人都可以帮助找出正确的语法(如果存在)?
int max(int n) { return n; } // end condition
template <int... N> // replacing int... with typename... works
int max(int n, N... rest) // !! error: unknown type name 'N'
{
int tmp = max(rest...);
return n < tmp? tmp : n;
}
#include <iostream>
int main()
{
std::cout << max(3, 1, 4, 2, 5, 0) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)