标签: c++

ANSI C相当于try/catch?

我有一些我正在使用的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++ exception-handling try-catch ansi-c

25
推荐指数
2
解决办法
9332
查看次数

C/C++原型的目的

我正在阅读关于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)

c c++ compiler-construction

25
推荐指数
3
解决办法
2万
查看次数

C++将指针传递给函数(Howto)+ C++指针操作

关于传递指针的工作原理,我有点困惑.

假设我有以下函数和指针,并且......

编辑:

...我想在函数中使用指向某个对象的指针作为参数.

即:

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个答案,但我必须选择第一个答案.我不确定社区维基是如何工作的,但我会这样离开编辑(如果您愿意,可随意将其转换为参考指南).

c++ pointers arguments function

25
推荐指数
2
解决办法
14万
查看次数

向量排序是否使迭代器无效?

 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++ sorting stl

25
推荐指数
3
解决办法
2725
查看次数

如何使用Win32以编程方式创建快捷方式

我需要使用C++以编程方式创建快捷方式.

如何使用Win32 SDK执行此操作?

什么API函数可用于此目的?

c++ windows winapi shortcut

25
推荐指数
2
解决办法
3万
查看次数

如何在模板实例化时故意造成编译时错误

有时,在使用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++ templates design-patterns

25
推荐指数
2
解决办法
1万
查看次数

在C++中的变量声明中使用struct关键字

我觉得这可能与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)

c++ struct

25
推荐指数
2
解决办法
2万
查看次数

每次运行程序时都有相同的随机数

我的随机数输出,每次运行我的游戏时以相同的顺序输出.为什么会这样?

我有

#include <cstdlib> 
Run Code Online (Sandbox Code Playgroud)

并使用它来生成随机数

randomDiceRollComputer = 1 + rand() % 6;
Run Code Online (Sandbox Code Playgroud)

c++ random

25
推荐指数
2
解决办法
5万
查看次数

libpcap可捕获10 Gbps网卡

我想从丢失0包的10Gbps网卡中捕获数据包.我正在使用lipcap用于100Mbps网卡,它工作正常.libpcap能否处理10Gbps网卡流量?如果没有,还有什么其他替代方法可以实现这一目标?

c++ networking

25
推荐指数
2
解决办法
1万
查看次数

C++ 11中的非类型可变参数函数模板

我看到一篇博客帖子使用了非类型的可变参数模板(目前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)

c++ variadic-templates c++11

25
推荐指数
3
解决办法
1万
查看次数