小编Dev*_*lar的帖子

如何dllexport从std :: runtime_error派生的类?

我已经设置了一个库,提供了一个从标准异常派生的异常类:

#include <stdexcept>
#include <string>

class BaseException : public std::runtime_error
{
    public:
        BaseException( std::string const & msg );
};
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.在Unix上编译和处理得很好.现在我准备将其编译成Windows DLL:

#ifdef WIN32
#define MY_EXPORT __declspec(dllexport)
#else
#define MY_EXPORT
#endif

#include <stdexcept>
#include <string>

class MY_EXPORT BaseException : public std::runtime_error
{
    public:
        BaseException( std::string const & msg );
};
Run Code Online (Sandbox Code Playgroud)

但是,这给了我警告C4275 : non – DLL-interface class 'std::runtime_error' used as base for DLL-interface class 'BaseException'.

不幸的是,我对微软风格的文档有些过敏:过于冗长,而且不是很重要.它让我完全不知道对我解决问题的实际期望是什么.

你们有人可以开导我吗?我可以删除基类,但然后捕获std::runtime_errorstd::exception不会捕获我的自定义异常类,我非常希望这是可能的.所以...?

c++ windows dll exception dllexport

14
推荐指数
1
解决办法
3875
查看次数

解析数字时scanf()和strtol()/ strtod()之间的区别

注意:我完全重写了这个问题,以更恰当地反映出我为此设置的赏金.请原谅与已经给出的答案有任何不一致之处.我不想创建一个新问题,因为之前的答案可能会有所帮助.


我正在努力实现一个C标准库,并对标准的一个特定角落感到困惑.

该标准定义了由接受数字格式scanf函数族(%d,%I,%U,%O,%X)在用于定义而言strtol,strtoul,和strtod.

该标准还规定,fscanf()只会将最多一个字符放回输入流中,因此一些序列可以接受strtol,strtoul并且strtod是不可接受的fscanf(ISO/IEC 9899:1999,脚注251).

我试图找到一些会表现出这种差异的价值观.事实证明,十六进制前缀"0x",后跟不是十六进制数字的字符,就是两个函数系列不同的情况.

有趣的是,很明显没有两个可用的C库似乎在输出上达成一致.(请参阅本问题末尾的测试程序和示例输出.)

我想听到的是解析"0xz"时会被视为符合标准的行为?.理想情况下引用标准中的相关部分来说明问题.

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int main()
{
    int i, count, rc;
    unsigned u;
    char * endptr = NULL;
    char culprit[] = "0xz";

    /* File I/O to assert fscanf == sscanf */
    FILE * fh = fopen( "testfile", "w+" );
    fprintf( fh, "%s", culprit );
    rewind( fh );

    /* fscanf …
Run Code Online (Sandbox Code Playgroud)

c standards standards-compliance

12
推荐指数
1
解决办法
4811
查看次数

ALSA相当于/ dev/audio dump?

这将是我有史以来最贫穷的问题......

在一台旧的上网本上,我安装了一个更旧的Debian版本,并玩了一下.其中一个相当令人满意的结果是一个非常基本的MP3播放器(使用libmpg123),它集成了为一个小应用程序添加背景音乐做一些完全不同的事情.我越来越喜欢这个小小的解决方案.

在那个程序中,我通过一个简单的方式将解码后的音频(从mpg123_decode())/dev/audio转发fwrite().

这在上网本上运行良好.

现在,我开始明白这/dev/audio是OSS所做的事情,并且不再支持更新的(ALSA)机器.果然,我的笔记本电脑(运行当前的Linux Mint)没有这个设备.

显然我必须使用ALSA.在网上搜索,我发现了几个教程,他们几乎让我大吃一惊.模式,参数,功能,访问类型,样本格式,采样率,通道数,周期数,周期大小......我理解ALSA是雄心勃勃的强大API,但这不是我想要的(或者有时间去grok).我正在寻找的是如何播放输出mpg123_decode(我甚至不知道的格式,远远不是一个音频极客).

谁能给我一些关于需要做什么的提示?

TL;博士

如何让ALSA播放原始音频数据?

c alsa

12
推荐指数
1
解决办法
5480
查看次数

memset_s():此文本的标准含义是什么?

在C11中,K.3.7.4.1 memset_s函数,我发现了一些相当混乱的文本:

不同于memsetmemset_s必须严格按照(5.1.2.3)中所述的抽象机规则评估对函数的任何调用。也就是说,对该memset_s函数的任何调用均应假定指示,s并且n将来可能会访问该内存,因此必须包含指示的值c

这意味着,memset(必须的)“进行评价严格按照抽象机的规则”。(所引用的章节是5.1.2.3 程序执行。)

我不明白标准memset在这里明确排除了的余地memset_s,以及这对任何一个函数的实现者意味着什么。

c language-lawyer

12
推荐指数
1
解决办法
126
查看次数

如何强制Boost使用rpath?

我必须在"通常"目录树之外构建Boost(即/custom/dir代替/usr),这不是一个很大的问题:只需传递--prefix=/custom/path./runscript.sh/ ./bjam,然后就可以了.

或者我想.

问题是一些Boost库彼此依赖,并且 - 使用通过./bootstrap.sh/ 的默认构建过程./bjam- 似乎--prefix路径没有添加到Boost库的库搜索路径,即没有-Wl,-rpath应用.这意味着依赖于其他Boost库的Boost库在运行时无法找到它们.

我的应用程序 - 链接那些/custom/pathBoost库 - 已经在./configure阶段失败,因为libboost_filesystem.so无法找到libboost_system.so,即使我传递-Wl,-rpath=/custom/path/boost/lib给我自己的编译器行(即Boost库的正确路径,我仔细检查了libboost_system.so那里).

现在,为了避免像设置这样的繁琐方法LD_LIBRARY_PATH,我想以某种方式构建Boost,以便所有Boost库都具有编译到其中的其他Boost库的正确搜索路径.但是,我无法找到适当的程序.有谁能够帮我?

boost bjam

10
推荐指数
2
解决办法
2726
查看次数

检测宏的用法?(错误)

这是非常具体的,有点难以解释,而且很可能不可能,但是这里有.

我想实现<errno.h>.(我的爱好项目正在实施标准C库.)

天真的方式是:

// in <errno.h>
extern int errno;

// in some .c file
int errno = 0;
Run Code Online (Sandbox Code Playgroud)

这有效.但它有一个缺点:如果调用数学库函数,它总是必须在执行后查询FPU状态以errno进行适当的设置.这使得FPU在数学繁重的应用程序中停滞不前.

Ç标准认可的懒评价errno通过使宏来代替:

int * __errno();
#define errno *__errno()
Run Code Online (Sandbox Code Playgroud)

这样,errno只有在实际请求其值时才"设置":

// "__errno()" returns the location of the current errno value,
// the "errno" macro turns it into a value.
x = errno;
Run Code Online (Sandbox Code Playgroud)

在库的其余部分给出一些逻辑,如果最后调用的库函数实际上是使用 FPU的库函数,则仅需要查询FPU状态,并且errno实际请求值.

到目前为止,一切都很好.但另一种方式是令我头疼:

errno = 0;
Run Code Online (Sandbox Code Playgroud)

errno根本不要求价值.但是__errno()不知道这一点,并且如果调用的最后一个库函数正在使用FPU,它将查询FPU状态.

现在我没有办法避免这种情况(即,根据它们是否用于赋值运算符的左侧或右侧,使 …

c macros c-preprocessor

9
推荐指数
1
解决办法
1282
查看次数

Xerces-C:从v2.x迁移到v3.x?

我想将一个项目(我不太熟悉的遗留代码)从Xerces-C v2.x迁移到v3.x.

事实证明,Xerces-C v3删除了DOMBuilder类.该迁移归档告诉我:

...许多DOM接口(DOMBuilder,DOMWriter,DOMInputSource等)被替换为最终DOM Level 3规范一致性工作的一部分.

真好.但有没有关于如何将依赖这些类的代码迁移到新API的指南?

c++ xml api upgrade xerces-c

8
推荐指数
1
解决办法
7056
查看次数

堆栈中的匿名对象,用C++编写?

我正在开发一个日志记录/跟踪单元(请不要指向现有的单元,这是为了获得与结果相同的体验).

要获得运行时调用堆栈跟踪,我们的想法是首先构造一个TraceObject实例,输入一个函数,它携带当前类和函数的信息.有点类似于:

TraceObject to( "MyClass", "myClassFunction" );
Run Code Online (Sandbox Code Playgroud)

TraceObject推送this每个线程堆栈的构造函数,析构函数再次弹出它.因此可以查询堆栈以获得调用堆栈.

我让这个工作满意.但是,有一个小小的飞贼:对象to.根据设计,它永远不会被该名称所引用.因此,它不需要具有名称,尤其是可能与客户端使用的任何标识符冲突的名称(或者,在_前缀的情况下,实现).

TL;博士

是否有可能在堆栈上创建一个匿名的非临时对象(即一个将在函数返回之前生效但没有标识符的对象),如果是,它将如何完成?

c++

8
推荐指数
1
解决办法
991
查看次数

c ++定义没有模板参数的成员类的类型

我试图设置类的成员的类型,而不通过模板参数传递它.

详情如下:

// Forward declaration:        
class A;        
class B;

class Base
{
};    

template <class T>    
class Derived : public Base
{    
    private:
        T2 var;    
};
Run Code Online (Sandbox Code Playgroud)

其中T可以是class Aclass B.我想做的是Derived<A>T2是int(例如),Derived<B>T2是double(例如).我想避免以下解决方案:

template <class T1, class T2>
class Derived : public Base
{
    private:
        T2 var;
};
Run Code Online (Sandbox Code Playgroud)

我想避免这种情况,因为Derived<A>有可能为T2是各种可能的组合:Derived<A,int>,Derived<A,double>,...

我想要的是T2的类型对整个来说是独一无二的Derived<A>.

知道如何解决这个问题吗?

c++ templates types member

8
推荐指数
2
解决办法
2413
查看次数

Tcl:默认变量是否为空?

我已经"继承"了一些Tcl代码,虽然我已经完成了一些教程并且能够理解语言,但是我自己的Tcl构造缺乏一定的技巧.

例如,我有这个代码:

puts "Column 'name': [ $queryRs getString name ]"
Run Code Online (Sandbox Code Playgroud)

$queryRs是SQL查询的结果集.该[ $queryRs getString name ]构造从结果集中的当前行检索表列"name"的内容.如果数据库字段为NULL,puts则不会打印任何内容.

我想打印一个"默认"字符串,即如果[ $queryRs getString name ]没有结果,我想用它替换它"--".

现在,我可以这样做:

set nameVar "[ $queryRs getString name ]"
if { [ string length $nameVar ] == 0 } {
    set nameVar "--"
}
puts "Column 'name': $nameVar"
Run Code Online (Sandbox Code Playgroud)

必须有一个更紧凑的解决方案,可以内联完成,而不是添加四行和一个临时变量.请帮忙?

string tcl

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