我找到了一个不起眼的日志记录错误,事实上长度为2的初始化列表似乎是一个特例!这怎么可能?
代码是使用Apple LLVM版本5.1(clang-503.0.40)编译的CXXFLAGS=-std=c++11 -stdlib=libc++.
#include <stdio.h>
#include <string>
#include <vector>
using namespace std;
typedef vector<string> Strings;
void print(string const& s) {
printf(s.c_str());
printf("\n");
}
void print(Strings const& ss, string const& name) {
print("Test " + name);
print("Number of strings: " + to_string(ss.size()));
for (auto& s: ss) {
auto t = "length = " + to_string(s.size()) + ": " + s;
print(t);
}
print("\n");
}
void test() {
Strings a{{"hello"}}; print(a, "a");
Strings b{{"hello", "there"}}; print(b, "b");
Strings c{{"hello", …Run Code Online (Sandbox Code Playgroud) Overflowers!
我一直在使用Visual Studio 2010开发一个静态链接的应用程序(嗯,它是跨平台的,但这只是一个Windows问题).
我在设置Debug配置的链接时遇到了一些问题,所以我没想到要更改它以进行Release配置会很困难,但经过一个下午的工作后,它仍然无法解决.尝试NODEFAULTLIB的各种值要么得到"未解决的外部符号"错误,要么"已经定义"错误,有时两者都有.
从我的笔记中,我已经尝试了NODEFAULTLIB-ing LIBCMT,MSVCRT,MSVCPRT或者根本没有,每次都有不同的结果(详见下文).
现在,我的Debug配置使用/ NODEFAULTLIB:MSVCRTD/NODEFAULTLIB:MSVCPRTD并且工作正常,因此您认为/ NODEFAULTLIB:MSVCRT/NODEFAULTLIB:MSVCPRT可用于Release配置.而事实上它并不是我的红旗......
我正在与其他几个库连接 - 我非常小心地系统地确保从Debug到Release时它们被认为是完全相同但可能是一个问题,如果是这样,如何系统地跟踪它?
谢谢你的亲切时光!
在"链接器/命令行"属性页中,"所有选项"为:
/OUT:".\Release\SlowGold 8.exe" /NOLOGO "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /MANIFEST /ManifestFile:".\Release\SlowGold 8.exe.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /PDB:".\Release\SlowGold 8.pdb" /SUBSYSTEM:WINDOWS /OPT:REF /OPT:ICF /PGD:"C:\development\rec-vs\rec\projects\slow\Builds\VisualStudio2010\Release\SlowGold 8.pgd" /LTCG /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:QUEUE
Run Code Online (Sandbox Code Playgroud)
和其他选项是:
/LIBPATH:..\\..\\..\\..\\externals\\rubberband\\win32\\ipp\\common ippacemerged.lib ippacmerged.lib ippcorel.lib ippsemerged.lib ippsmerged.lib ippsremerged.lib ippsrmerged.lib /LIBPATH:..\\..\\..\\..\\externals\\rubberband\\win32\\ipp\\release\\static rubberband-library.lib /LIBPATH:..\\..\\..\\..\\..\\glog\\Release libglog_static.lib /LIBPATH:..\\..\\..\\..\\..\\mpg123\\ports\\MSVC++\\2008\\Release libmpg123.lib /LIBPATH:..\\..\\..\\..\\..\\protobuf\\vsprojects\\Release libprotobuf.lib
Run Code Online (Sandbox Code Playgroud)
以下是各种/ NODEFAULTLIB:值的一些错误消息.
迄今为止最好的:/ NODEFAULTLIB:LIBCMT
1>------ Build started: Project: Slow, Configuration: Release Win32 ------
1>msvcprt.lib(MSVCP100.dll) …Run Code Online (Sandbox Code Playgroud) 我是一个大量使用继承的Python项目的维护者.有一种反模式导致了我们一些问题并使阅读变得困难,我正在寻找一种解决它的好方法.
问题是将非常长的参数列表从派生类转发到基类 - 大多数但并不总是在构造函数中.
考虑这个人为的例子:
class Base(object):
def __init__(self, a=1, b=2, c=3, d=4, e=5, f=6, g=7):
self.a = a
# etc
class DerivedA(Base):
def __init__(self, a=1, b=2, c=300, d=4, e=5, f=6, g=700, z=0):
super().__init__(a=a, b=b, c=c, d=d, e=e, f=f, g=g)
self.z = z
class DerivedB(Base):
def __init__(self, z=0, c=300, g=700, **kwds):
super().__init__(c=c, g=g, **kwds)
self.z = z
Run Code Online (Sandbox Code Playgroud)
此时,一切看起来都像DerivedA- 长参数列表,所有这些都明确地传递给基类.
不幸的是,我们在过去几年中遇到了一些问题,包括忘记传递参数并获取默认值,以及没有注意到一个派生类中的一个默认参数与默认默认值不同.
它还使代码不必要地笨重,因此难以阅读.
DerivedB是更好并修复这些问题,但有一个新的问题,派生类中的方法的Python帮助/ sphinx HTML文档是误导,因为很多重要的参数都隐藏在**kwds.
有没有办法将正确的签名 - 或者至少是正确签名的文档 - 从基类方法转发到派生类方法?
我已经阅读了有关这方面的各种权威,包括Dewhurst,但却没有设法通过这个看似简单的问题.
我想要做的是调用 C++ 函数对象(基本上,你可以调用的任何东西,纯函数或带()的类,并返回它的值,如果它不是void,否则返回"true".
using std:
struct Foo {
void operator()() { cout << "Foo/"l; }
};
struct Bar {
bool operator()() { cout << "Bar/"; return true; }
};
Foo foo;
Bar bar;
bool baz() { cout << "baz/"; return true; }
void bang() { cout << "bang/"; }
const char* print(bool b) { cout << b ? "true/" : "false/"; }
template <typename Functor> bool magicCallFunction(Functor f) {
return true; // Lots of template …Run Code Online (Sandbox Code Playgroud) 我终于开始将我的代码库迁移到C++ 11,这导致代码更短更好.
然而,我发现当我使用新指针调用函数时,它比以前要长得多:
void addCallback(Callback*); // Takes ownership of callback.
// ...
addCallback(new Callback); // Clear.
Run Code Online (Sandbox Code Playgroud)
变
void addCallback(std::unique_ptr<Callback>); // No comment needed now!
// ...
addCallback(std::move(std::unique_ptr<Callback>(new Callback))); // bleh.
Run Code Online (Sandbox Code Playgroud)
建议的make_unique()模板功能只会稍微改善这一点.
经过一些实验,我刚刚为此编写了一个辅助模板函数:
template <typename T>
auto move_ptr(T *t) -> decltype(std::move(std::unique_ptr<T>(t))) {
return std::move(std::unique_ptr<T>(t));
}
// ..
addCallback(move_ptr(new Callback)); // Not bad!
Run Code Online (Sandbox Code Playgroud)
它似乎工作得很好 - 但我肯定在重新发明轮子?(如果我不是 - 是否有任何陷阱或可能的错误与我move_ptr或其他任何我最终称呼它?)
我想在头文件中转发声明变量模板,然后在单独的编译单元中进行实际实例化.
我被引导相信C++ 14变量模板的运行方式与静态类变量非常相似.不幸的是,这似乎并非如此,它阻止我向前声明我的变量模板.
template <typename T> struct Variable {
static int variable;
};
template <typename T>
extern int variable;
int main() {
(void) Variable<char>::variable;
// (void) variable<char>; // <-- line 10
}
template <> int Variable<char>::variable = 42;
template <> int variable<char> = 23;
Run Code Online (Sandbox Code Playgroud)
上面的代码示例在GCC下编译并按原样运行.但是,取消注释第10行会产生编译时错误:
specialization of 'variable<char>' after instantiation
template <> int variable<char> = 23;
^
Run Code Online (Sandbox Code Playgroud) 当我从setup.py编译我的代码时,它找不到C++ 11包含文件<array>- 但C++ 11编译器功能确实有效.
当我将setup.py生成的相同命令行粘贴到我的shell中时,它完全编译得很好(!)
终端会议:
$ python setup.py build_ext
running build_ext
building 'simple' extension
creating build
creating build/temp.macosx-10.6-intel-3.4
/usr/bin/clang -fno-strict-aliasing -Werror=declaration-after-statement -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -arch i386 -arch x86_64 -g -Isrc -I/Library/Frameworks/Python.framework/Versions/3.4/include/python3.4m -c simple.cpp -o build/temp.macosx-10.6-intel-3.4/simple.o -Wno-unused-function -std=c++11
In file included from simple.cpp:289:
./simple.h:2:10: fatal error: 'array' file not found
#include <array>
^
1 error generated.
error: command '/usr/bin/clang' failed with exit status 1
$ /usr/bin/clang -fno-strict-aliasing -Werror=declaration-after-statement …Run Code Online (Sandbox Code Playgroud) 在我的多线程(*)控制台应用程序中使用tk导致它在没有stacktrace的情况下崩溃,给出消息"Tcl_WaitForEvent:Notifier not initialized Abort trap".
症状是我的所有程序的功能都运行良好,直到我提起tk窗口 - 然后下一次操作将导致崩溃.
立即搜索发现Tkinter对于Python线程是不安全的,所以我确保除了我的主线程之外我没有调用任何Tk函数.崩溃继续.
我失去了几个小时,因为我相信这是我使用的特定命令使程序崩溃 - 但最终我意识到任何键盘输入都会使程序崩溃.
经过大量的调试后,我最终将其归结为一个演示该问题的小程序,揭示了我认为是一个错误或者肯定是需要Tkinter库中的文档的功能.
我正在调试这个帖子.我将它张贴和回答我的问题,因为它会阻止下一个人从它浪费了一天的希望.
-
(* - 是的,它肯定需要多线程.我有一个用于我的套接字连接的线程,一个侦听麦克风并找到级别的线程,一个驱动我的串口的线程等等.在每种情况下,都是我正在阅读线程,大部分时间自然会阻塞.)
我正在研究一个需要能够运行的Python程序,即使它缺少某些功能所需的某些库.(编辑:我写了一些代码来实现最好的建议解决方案,就在这里,这里有doctest .)
我通过将这些库的import语句内联到使用它们的函数而不是Python文件的顶部来解决这个问题.这意味着即使您没有库也可以很好地加载文件,但是如果您尝试调用其中一个函数,当然会抛出ImportError.
这个工作做得很好,我发现自己有时也会为标准库模块做这个 - 但现在我想知道我是否会因此而产生一些隐藏的成本?
基线代码:
import numpy
def foo():
return numpy.array([])
def bar():
return numpy.array([1, 2, 3])
Run Code Online (Sandbox Code Playgroud)
内联导入代码:
def foo():
import numpy
return numpy.array([])
def bar():
import numpy
return numpy.array([1, 2, 3])
Run Code Online (Sandbox Code Playgroud)
编辑:
我完全同意不内联标准库代码 - 显然很糟糕.
我现在认为保护导入是正确的解决方案.
特别是,我对这些调用进行了一些时序测试,虽然时间差对于大多数应用来说可能并不重要,但它很明显(细线,我知道!)
在琐碎的情况下
import numpy
def f():
return numpy
Run Code Online (Sandbox Code Playgroud)
在我的机器上花费大约180ms重复100,000次但是
def f():
import numpy
return numpy
Run Code Online (Sandbox Code Playgroud)
需要大约870毫秒.
非常粗略的说法是,这需要花费四个微不足道的函数调用 - 在大多数情况下显而易见但不显着.尽管如此,最好还是避免如果不花费你这么做.
在实验中,我还意识到了内联导入的另一个缺点 - 当调用该函数时,这些导入会在不可预测的时间内消失.在我的具有实时元素的应用程序中,这是不可接受的.
在下面的程序片段中,我从远程位置克隆了一个现有的存储库,它工作正常。
然后我尝试克隆一个不存在的存储库,这次调用git.Repo.clone_from()从键盘请求名称和密码。
在我的应用程序中,等待键盘输入时发生阻塞是非常不可取的,因此如果存储库不存在,我希望调用git.Repo.clone_from()来抛出异常。
有什么方法可以导致这种情况发生,或者在我尝试克隆它之前以某种方式检测现有 URL 上是否存在 git 存储库?
import git, shutil
DIRECTORY = '/tmp/clone'
def clone(url):
print(url)
shutil.rmtree(DIRECTORY, ignore_errors=True)
git.Repo.clone_from(url=url, to_path=DIRECTORY, b='master')
clone('https://github.com/ManiacalLabs/BiblioPixelAnimations.git/')
clone('https://github.com/ManiacalLabs/NONEXISTENT.git/')
Run Code Online (Sandbox Code Playgroud) python ×5
c++ ×4
c++11 ×3
c++14 ×1
cython ×1
github ×1
github-pages ×1
gitpython ×1
linker ×1
python-attrs ×1
sfinae ×1
templates ×1
tkinter ×1
visual-c++ ×1