我已经设置了一个库,提供了一个从标准异常派生的异常类:
#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_error或std::exception不会捕获我的自定义异常类,我非常希望这是可能的.所以...?
注意:我完全重写了这个问题,以更恰当地反映出我为此设置的赏金.请原谅与已经给出的答案有任何不一致之处.我不想创建一个新问题,因为之前的答案可能会有所帮助.
我正在努力实现一个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) 这将是我有史以来最贫穷的问题......
在一台旧的上网本上,我安装了一个更旧的Debian版本,并玩了一下.其中一个相当令人满意的结果是一个非常基本的MP3播放器(使用libmpg123),它集成了为一个小应用程序添加背景音乐做一些完全不同的事情.我越来越喜欢这个小小的解决方案.
在那个程序中,我通过一个简单的方式将解码后的音频(从mpg123_decode())/dev/audio转发fwrite().
这在上网本上运行良好.
现在,我开始明白这/dev/audio是OSS所做的事情,并且不再支持更新的(ALSA)机器.果然,我的笔记本电脑(运行当前的Linux Mint)没有这个设备.
显然我必须使用ALSA.在网上搜索,我发现了几个教程,他们几乎让我大吃一惊.模式,参数,功能,访问类型,样本格式,采样率,通道数,周期数,周期大小......我理解ALSA是雄心勃勃的强大API,但这不是我想要的(或者有时间去grok).我正在寻找的是如何播放输出mpg123_decode(我甚至不知道的格式,远远不是一个音频极客).
谁能给我一些关于需要做什么的提示?
TL;博士
如何让ALSA播放原始音频数据?
在C11中,K.3.7.4.1 memset_s函数,我发现了一些相当混乱的文本:
不同于
memset,memset_s必须严格按照(5.1.2.3)中所述的抽象机规则评估对函数的任何调用。也就是说,对该memset_s函数的任何调用均应假定指示,s并且n将来可能会访问该内存,因此必须包含指示的值c。
这意味着,memset是不(必须的)“进行评价严格按照抽象机的规则”。(所引用的章节是5.1.2.3 程序执行。)
我不明白标准memset在这里明确排除了的余地memset_s,以及这对任何一个函数的实现者意味着什么。
我必须在"通常"目录树之外构建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库的正确搜索路径.但是,我无法找到适当的程序.有谁能够帮我?
这是非常具体的,有点难以解释,而且很可能不可能,但是这里有.
我想实现<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状态.
现在我没有办法避免这种情况(即,根据它们是否用于赋值运算符的左侧或右侧,使 …
我想将一个项目(我不太熟悉的遗留代码)从Xerces-C v2.x迁移到v3.x.
事实证明,Xerces-C v3删除了DOMBuilder类.该迁移归档告诉我:
...许多DOM接口(DOMBuilder,DOMWriter,DOMInputSource等)被替换为最终DOM Level 3规范一致性工作的一部分.
真好.但有没有关于如何将依赖这些类的代码迁移到新API的指南?
我正在开发一个日志记录/跟踪单元(请不要指向现有的单元,这是为了获得与结果相同的体验).
要获得运行时调用堆栈跟踪,我们的想法是首先构造一个TraceObject实例,输入一个函数,它携带当前类和函数的信息.有点类似于:
TraceObject to( "MyClass", "myClassFunction" );
Run Code Online (Sandbox Code Playgroud)
TraceObject推送this每个线程堆栈的构造函数,析构函数再次弹出它.因此可以查询堆栈以获得调用堆栈.
我让这个工作满意.但是,有一个小小的飞贼:对象to.根据设计,它永远不会被该名称所引用.因此,它不需要具有名称,尤其是可能与客户端使用的任何标识符冲突的名称(或者,在_前缀的情况下,实现).
TL;博士
是否有可能在堆栈上创建一个匿名的非临时对象(即一个将在函数返回之前生效但没有标识符的对象),如果是,它将如何完成?
我试图设置类的成员的类型,而不通过模板参数传递它.
详情如下:
// 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 A或class 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>.
知道如何解决这个问题吗?
我已经"继承"了一些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)
但必须有一个更紧凑的解决方案,可以内联完成,而不是添加四行和一个临时变量.请帮忙?