我有一个功能:
// string is a null-terminated char array. Replace all a in the string with b
void ReplaceCharInString(char *string, char a, char b)
{
// loop over the string char by char, to find all "a"s and replace them with "b"
}
Run Code Online (Sandbox Code Playgroud)
我在做防守编程.问题是客户端上的实现回复真正传递了一系列字符.如果传入单个字符的地址,程序肯定会遇到错误的状态(可能崩溃).我该如何检查并避免这种情况?(我知道如果我传入std :: string对象,问题就会消失)
受Muhammad Alkarouri的启发,回答Python3的"功能注释"有什么用处,我想multimethod为方法做到这一点,而不是常规功能.但是,当我这样做
registry = {}
class MultiMethod(object):
def __init__(self, name):
self.name = name
self.typemap = {}
def __call__(self, *args):
types = tuple(arg.__class__ for arg in args) # a generator expression!
function = self.typemap.get(types)
if function is None:
raise TypeError("no match")
return function(*args)
def register(self, types, function):
if types in self.typemap:
raise TypeError("duplicate registration")
self.typemap[types] = function
def multimethod(function):
name = function.__name__
mm = registry.get(name)
if mm is None:
mm = registry[name] = MultiMethod(name)
types = tuple(function.__annotations__.values()) …Run Code Online (Sandbox Code Playgroud) 在我声明的标题中
#ifndef SOUND_CORE
#define SOUND_CORE
static SoundEngine soundEngine;
...
Run Code Online (Sandbox Code Playgroud)
但SoundEngine的构造函数被多次调用,当它被声明为全局静态时,它是如何可能的
我称之为
#include "SoundCore.h"
Run Code Online (Sandbox Code Playgroud)
并直接使用它
soundEngine.foo()
Run Code Online (Sandbox Code Playgroud)
谢谢
我想做的事情如下:
for i in *
do
if test -d $i
then
cd $i; make clean; make; cd -;
fi;
done
Run Code Online (Sandbox Code Playgroud)
这样可以正常工作,但是for如果构建破坏,我希望"打破" -loop.
有没有办法做到这一点?也许某种 - if陈述,可以检查成功make吗?
请注意,这与Operator Precedence ..()和++,未定义的行为和序列点无关,为什么这些构造(使用++)是未定义的行为?以及关于此的数百个类似问题
简而言之:标准保证了协会性吗?
详细示例:来自维基百科关于运算符优先级的文章,operator*并且operator/具有相同的优先级,它们是Left-to-right运算符.这是否意味着,标准保证,这:
int res = x / y * z / t;
Run Code Online (Sandbox Code Playgroud)
将被评估为
int res = ( ( x / y ) * z ) / t;
Run Code Online (Sandbox Code Playgroud)
还是它的实现定义了?
如果有保证,你能引用吗?
这只是出于好奇,我总是在这些情况下写括号.
准备删除问题,如果有这样的话.
对于会员,我使用
//.......vv
SomeType m_XXX;
//.......^^
Run Code Online (Sandbox Code Playgroud)
我喜欢_用作成员函数的前缀,但名称以_或__以保留开头且不应使用.
我的想法是,当我有:
SomeClass myObject;
myObject.[XXX]
Run Code Online (Sandbox Code Playgroud)
当用户(lib)写入dot(.)时,只能查看所有函数(一个接一个)public.
这有一个共同的命名约定吗?
我知道,我可以使用pImpl或继承接口和实现类
我有2个库:test.1和test.2.两个库都包含单个全局extern"C" void f();函数,具有不同的实现(仅cout用于测试).
我做了以下测试:
测试1动态链接:
如果我添加libtest.1.so,然后libtest.2.so在可执行文件的生成文件,然后调用f();中main,libtest.1.so->f()被调用.
如果我更改makefile中的顺序,libtest.2.so->f()则调用
测试2静态链接:
静态库完全相同
测试3动态加载
手动加载库时,一切都按预期工作.
我预计多个定义会出错,这显然不会发生.
此外,这不会打破单一定义规则,因为情况不同.
它也不是一个依赖地狱(不是它与此有关),也不是任何链接惨败..
那么,这是什么呢?未定义的行为?未指明的行为?或者它确实取决于链接顺序?
有没有办法轻松检测到这种情况?
相关问题:
dlopen与链接开销
动态链接和动态加载之间的区别
使用-Bsymbolic函数是否存在缺点?
为什么库链接的顺序有时会导致GCC错误?
将两个共享库与一些相同的符号链接起来
编辑我做了两个测试,证实了这个UB:
我添加了第二个函数void g()中test.1,而不是在test.2.
使用动态链接和.so库,同样的事情 - f以相同的方式调用,g也是可执行的(如预期的那样).
但是使用静态链接现在改变了一些事情:如果test.1是之前 test.2,没有错误,test.1则会调用两个函数.
但是当订单更改时,会出现"多个定义"错误.
很明显,"不需要诊断"(参见@MarkB的答案),但有时候发生错误是"奇怪的",有时候 - 它没有.
无论如何,答案很清楚,并解释了上面的一切 - UB.
c c++ dynamic-linking multiple-definition-error static-linking
我教授的家庭作业的代码如下.这是开箱即用的,我没有修改我教授的代码.程序还有更多内容,但这是错误发生的地方.问题行以粗体显示.
std::cout << "\nAll remaining courses with enrollments:\n";
allCourses = WSUCourse::getAllCourses();
std::for_each(
allCourses.begin(),
allCourses.end(),
WSUCoursePrinter());
Run Code Online (Sandbox Code Playgroud)
我收到以下错误.
g++ -c -g -std=c++11 -MMD -MP -MF "build/Debug/Cygwin_4.x-Windows/main.o.d" -o build/Debug/Cygwin_4.x-Windows/main.o main.cpp
main.cpp: In member function 'void WSUStudentPrinter::operator()(const WSUStudent*)':
main.cpp:26:20: error: 'to_string' is not a member of 'std'
std::cout << std::to_string(studentPtr->getUniqueID()) <<
^
main.cpp: In function 'void test()':
main.cpp:162:4: error: 'for_each' is not a member of 'std'
std::for_each(
^
main.cpp:174:4: error: 'for_each' is not a member of 'std'
std::for_each(
^
nbproject/Makefile-Debug.mk:84: recipe for target 'build/Debug/Cygwin_4.x-Windows/main.o' …Run Code Online (Sandbox Code Playgroud) 一个简单的问题:你time(...)和clock_gettime( CLOCK_REALTIME, ... )(仅就秒),理论上产生相同的时间?
这就是我的意思:
time_t epoch;
time( &epoch );
Run Code Online (Sandbox Code Playgroud)
和
struct timespec spec;
clock_gettime( CLOCK_REALTIME, &spec );
Run Code Online (Sandbox Code Playgroud)
这两个应该返回完全相同的结果(相对于秒)?
我通过改变时间和时区来"测试"这个epoch并且spec.tv_sec总是显示相同的结果,但是文档CLOCK_REATIME让我感到困惑,我不确定,它们将始终是相同的.
现实世界的情况:我有一段代码,它使用time.现在我想要以毫秒为单位的时间(可以取spec.tv_nsec,乘以1000000).所以我考虑time直接删除和使用clock_gettime,但我不确定在所有情况下这是否会保持不变.
这个问题在某种程度上与Linux中的测量时间有关- 时间与时间对比getrusage vs clock_gettime vs gettimeofday vs timespec_get?但那里的信息对我来说还不够......我想.
真的很抱歉极其愚蠢的头衔,但如果我知道它是什么,我不会写在这里(:
def some_decorator( func ):
# ..
class A:
@some_decorator
def func():
pass
@func.some_decorator # this one here - func.some_decorator ?
def func():
pass
Run Code Online (Sandbox Code Playgroud)
some_decorator装饰func- 没关系.但是,成员(或其他什么?)是什么func.some_decorator以及如何some_decorator成为func?
PS我90%肯定,这里有这样的问题(因为这似乎是基本的东西),但我不知道如何搜索它.如果有完全重复,我会删除这个问题.
注意:两个成员函数都被命名,这不是错字,也不是偶然的func.装饰器用于重载:问题与装饰方法有关(类方法重载)