小编Tom*_*rly的帖子

C++ 11初始化列表失败 - 但仅限于长度为2的列表

我找到了一个不起眼的日志记录错误,事实上长度为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)

c++ initializer-list c++11

71
推荐指数
2
解决办法
2933
查看次数

VS2010 C++项目中的NODEFAULTLIB噩梦:在调试中链接很好,在发布时找不到一致的库集

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)

linker visual-studio-2010 visual-c++

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

在"github pages"网站中查看.rst

我正在将一个开源项目的文档移到Github Pages上,但我仍然坚持移动.rst文件.

我们有一个ReadMe.rst,你可以在这里看到代码.我想从我们的主文档页面链接到该页面,但是GitHub不会将.rst呈现为HTML,因此当您单击链接时,浏览器只会下载.rst文件的文本.

当然有工具将.rst呈现为HTML,但这是一个非常重要的步骤.我们开始使用.rst的全部原因完全是因为GitHub在代码页中自动呈现它.您认为有一些方法可以让Github Pages发生这种自动渲染......

restructuredtext github github-pages

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

完美转发 - 在Python中

我是一个大量使用继承的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.

有没有办法将正确的签名 - 或者至少是正确签名的文档 - 从基类方法转发到派生类方法?

python python-attrs

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

SFINAE并检测C++函数对象是否返回void

我已经阅读了有关这方面的各种权威,包括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++ sfinae

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

是否有std :: move(std :: unique_ptr())组合的标准缩写?

我终于开始将我的代码库迁移到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++ c++11

5
推荐指数
1
解决办法
1075
查看次数

无法在不定义模板变量的情况下声明模板变量

我想在头文件中转发声明变量模板,然后在单独的编译单元中进行实际实例化.

我被引导相信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)

c++ templates variable-templates c++14

5
推荐指数
1
解决办法
493
查看次数

Cython构建无法找到C++ 11 STL文件 - 但仅在从setup.py调用时才能找到

当我从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)

python cython c++11

5
推荐指数
1
解决办法
399
查看次数

使用tk在多线程Python控制台应用程序中模糊,可重复的崩溃

在我的多线程(*)控制台应用程序中使用tk导致它在没有stacktrace的情况下崩溃,给出消息"Tcl_WaitForEvent:Notifier not initialized Abort trap".

症状是我的所有程序的功能都运行良好,直到我提起tk窗口 - 然后下一次操作将导致崩溃.

立即搜索发现Tkinter对于Python线程是不安全的,所以我确保除了我的主线程之外我没有调用任何Tk函数.崩溃继续.

我失去了几个小时,因为我相信这是我使用的特定命令使程序崩溃 - 但最终我意识到任何键盘输入都会使程序崩溃.

经过大量的调试后,我最终将其归结为一个演示该问题的小程序,揭示了我认为是一个错误或者肯定是需要Tkinter库中的文档的功能.

我正在调试这个帖子.我将它张贴和回答我的问题,因为它会阻止下一个人从它浪费了一天的希望.

-

(* - 是的,它肯定需要多线程.我有一个用于我的套接字连接的线程,一个侦听麦克风并找到级别的线程,一个驱动我的串口的线程等等.在每种情况下,都是我正在阅读线程,大部分时间自然会阻塞.)

python tkinter

4
推荐指数
2
解决办法
2776
查看次数

使用内联导入是否可能产生负面影响?

我正在研究一个需要能够运行的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毫秒.

非常粗略的说法是,这需要花费四个微不足道的函数调用 - 在大多数情况下显而易见但不显着.尽管如此,最好还是避免如果不花费你这么做.

在实验中,我还意识到了内联导入的另一个缺点 - 当调用该函数时,这些导入会在不可预测的时间内消失.在我的具有实时元素的应用程序中,这是不可接受的.

python

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

阻止 GitPython 在尝试克隆不存在的远程存储库时询问凭据

在下面的程序片段中,我从远程位置克隆了一个现有的存储库,它工作正常。

然后我尝试克隆一个不存在的存储库,这次调用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 gitpython

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