小编Naw*_*waz的帖子

我应该下载哪个Clang编译器?

我想在我的系统上安装Clang compliler.我去了这个链接,但有很多下载选项让我感到困惑,我应该下载哪个版本?

我正在使用戴尔的笔记本电脑:Windows 7 Basic 64位.我已经安装了MinGW 4.5.0版.我还安装了Visual Studio 2008以及2010.

您认为对我来说最好的选择是什么?我应该下载哪个Clang?我该如何配置?我将第一次使用Clang.所以建议我最好的选择!

顺便说一句,我可以配置Clang(或Visual Studio),以便Visual Studio可以使用Clang编译器来编译我的C和C++代码吗?


编辑:

下载页面隐藏地显示"Mingw32/x86的前端二进制文件"时,这意味着什么?

c c++ gcc clang visual-studio

24
推荐指数
1
解决办法
9350
查看次数

在C++中编译和打印在编译时的阶乘

template<unsigned int n>
struct Factorial {
    enum { value = n * Factorial<n-1>::value};
};

template<>
struct Factorial<0> {
    enum {value = 1};
};

int main() {
    std::cout << Factorial<5>::value;
    std::cout << Factorial<10>::value;
}
Run Code Online (Sandbox Code Playgroud)

上面的程序在编译期间计算阶乘值.我想在编译时打印阶乘值,而不是在运行时使用cout打印.我们怎样才能在编译时打印阶乘值?

我正在使用VS2009.

谢谢!

c++ templates compile-time

23
推荐指数
2
解决办法
7804
查看次数

为什么这个双值打印为"-0"?

double a = 0;
double b = -42;
double result = a * b;
cout << result;
Run Code Online (Sandbox Code Playgroud)

结果a * b-0,但我预料到了0.我哪里做错了?

c++

23
推荐指数
1
解决办法
823
查看次数

从另一个进程获取win32线程的StartAddress

背景:

我在Win32中编写了一个多线程应用程序,我使用Process来自System.Diagnostics命名空间的类从C#代码开始.

现在,在C#代码中,我想获取在Win32应用程序中创建的每个线程的起始地址的名称/符号,以便我可以将与线程相关的信息(例如CPU使用情况)记录到数据库中.基本上,C#代码启动Win32应用程序的多个实例,监视它们,如果需要则终止,然后将info/error/exceptions/reason/etc记录到数据库.

为此,我已经包装了两个Win32 API viz.SymInitialize以及SymFromAddr我自己编写的程序友好API,如下所示:

extern "C"
{
    //wraps SymInitialize
    DllExport bool initialize_handler(HANDLE hModue);

    //wraps SymFromAddr
    DllExport bool get_function_symbol(HANDLE hModule, //in
                                       void *address,  //in
                                       char *name);    //out
}
Run Code Online (Sandbox Code Playgroud)

然后使用pinvoke从C#代码调用这些API.但它不起作用,并GetLastError提供126 错误代码,这意味着:

指定的模块无法找到

我传递Process.HandlehModule这两个函数; initialize_handler似乎工作,但get_function_symbol没有; 它给出了上述错误.我不确定我是否通过了正确的手柄.我尝试传递以下句柄:

Process.MainWindowHandle
Process.MainModule.BaseAddress
Run Code Online (Sandbox Code Playgroud)

两者都在第一步失败(即调用时initialize_handler).我Process.Threads[i].StartAddress作为第二个参数传递,这似乎是失败的原因,ProcessThread.StartAddress似乎是RtlUserThreadStart函数的地址,而不是特定于应用程序的启动函数的地址.在MSDN说一下吧:

每个Windows线程实际上都是在系统提供的函数中开始执行,而不是应用程序提供的函数.因此,主线程的起始地址与系统中的每个Windows进程相同(因为它表示系统提供的函数的地址).但是,StartAddress属性允许您获取特定于应用程序的起始函数地址.

但它没有说明如何使用ProcessThread.StartAddress获取特定于应用程序的startinbg函数地址.

题:

我的问题是从另一个应用程序(用C#编写)获取win32线程的起始地址,因为一旦我得到它,我将使用上面提到的API得到名称.那么如何获得起始地址?


我从C++代码测试了我的符号查找API.如果给出正确的地址,它可以很好地将地址解析为符号.

这是我的p/invoke声明:

[DllImport("UnmanagedSymbols.dll", SetLastError = true, …
Run Code Online (Sandbox Code Playgroud)

c# c++ dll pinvoke process

22
推荐指数
1
解决办法
6614
查看次数

在全局范围内使用静态变量和函数

标记变量是否有用static,当它位于.cpp文件的全局范围内时,不在函数中?

你也可以将static关键字用于函数吗?如果是的话,它们的用途是什么?

c++ static global global-variables static-variables

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

`std :: set`有什么问题?

另一个主题中,我试图解决这个问题.问题是从a中删除重复的字符std::string.

std::string s= "saaangeetha";
Run Code Online (Sandbox Code Playgroud)

由于订单并不重要,所以我s先排序,然后使用std::unique并最终调整大小以获得所需的结果:

aeghnst
Run Code Online (Sandbox Code Playgroud)

那是正确的!


现在我想做同样的事,但同时我希望字符的顺序完好无损.意思是,我想要这个输出:

sangeth
Run Code Online (Sandbox Code Playgroud)

所以我写了这个:

template<typename T>
struct is_repeated
{
    std::set<T>  unique;
    bool operator()(T c) { return !unique.insert(c).second; }
}; 
int main() {
    std::string s= "saaangeetha";
    s.erase(std::remove_if(s.begin(), s.end(), is_repeated<char>()), s.end()); 
    std::cout << s ;
}
Run Code Online (Sandbox Code Playgroud)

这给出了这个输出:

saangeth
Run Code Online (Sandbox Code Playgroud)

也就是说,a重复,但其他重复已经消失.代码有什么问题?

无论如何我改变了我的代码 :(见评论)

template<typename T>
struct is_repeated
{
    std::set<T> & unique;  //made reference!
    is_repeated(std::set<T> &s) : unique(s) {} //added line!
    bool …
Run Code Online (Sandbox Code Playgroud)

c++ string stl set remove-if

21
推荐指数
3
解决办法
1686
查看次数

本地类:C++ 03与C++ 11

C++ 11中本地类的用法是否有任何变化?

看来在C++ 03中,本地类不能用作模板参数(我记得).

考虑一下这段代码

template<typename T> void f(const T&) {}

//Note : S is a local class defined inside main()
int main() { struct S{};  f(S()); } //I want template argument to be deduced.
Run Code Online (Sandbox Code Playgroud)

但它给出了编译错误(C++ 03模式),说(ideone):

prog.cpp:4:错误:没有匹配函数来调用'f(main():: S)'

但是,在C++ 11模式(ideone)中编译它时编译很好,这对我来说很有意义,否则lambda将无效.所以我想至少在本地类的使用方面有这种变化.我对吗?有关本地课程的其他变化是什么?

请引用标准(C++ 03和C++ 11)中的相关文本,以便读者可以比较自己,以供将来参考.

c++ templates local-class c++11

21
推荐指数
2
解决办法
1616
查看次数

列表初始化中元素的评估顺序

另一个主题中,@ Didmar给出了这个解决方案:

template <typename... T>
std::tuple<T...> parse(std::istream& in) 
{
    return std::tuple<T...>{ T(in)... };
}
Run Code Online (Sandbox Code Playgroud)

说明,

大括号初始化的使用起作用,因为大括号初始化列表中参数的求值顺序是它们出现的顺序.(强调我的)

C++标准(n3485)的相关文本是,

在braced-init-list的initializer-list中,initializer-clauses(包括pack扩展(14.5.3)产生的任何结果)按照它们出现的顺序进行评估.也就是说,与给定初始化子句相关联的每个值计算和副作用在每个值计算和副作用之前与在初始化列表的逗号分隔列表中跟随它之后的任何初始化子句相关联.[注意:无论初始化的语义如何,此评估顺序都保持不变; 例如,当initializer-list的元素被解释为构造函数调用的参数时,它适用,即使通常对调用的参数没有排序约束. - 尾注]


所以我尝试用以下代码测试它:

template<int N>
struct A 
{ 
    std::string data;
    A(std::istream & stream) { stream >> data; }
    friend std::ostream& operator<<(std::ostream & out, A<N> const & a) 
    {
        return out << "A"<<N<<"::data = " << a.data;
    }
};
typedef A<1> A1;
typedef A<2> A2;

template<typename ...Args>
void test(std::istream & stream)
{
    std::tuple<Args...> args { Args(stream)... }; …
Run Code Online (Sandbox Code Playgroud)

c++ gcc operator-precedence initializer-list c++11

21
推荐指数
1
解决办法
2047
查看次数

使用LibVLC播放时保存流

使用LibVLC,我正在尝试在播放时保存流.这是python代码:

import os
import sys
import vlc

if __name__ == '__main__':
    filepath = <either-some-url-or-local-path>
    movie = os.path.expanduser(filepath)
    if 'http://' not in filepath:
        if not os.access(movie, os.R_OK):
            print ( 'Error: %s file is not readable' % movie )
            sys.exit(1)
    instance = vlc.Instance("--sub-source marq --sout=file/ps:example.mpg")
    try:
        media = instance.media_new(movie)
    except NameError:
        print ('NameError: % (%s vs Libvlc %s)' % (sys.exc_info()[1],
                       vlc.__version__, vlc.libvlc_get_version()))
        sys.exit(1)
    player = instance.media_player_new()
    player.set_media(media)
    player.play()

    #dont exit!
    while(1):
        continue
Run Code Online (Sandbox Code Playgroud)

它将视频流保存到文件中example.mpg.根据文档,保存流的命令是:

--sout=file/ps:example.mpg
Run Code Online (Sandbox Code Playgroud)

我在创建实例时使用的vlc.Instance …

c c++ python video-streaming libvlc

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

如果我没有头文件,如何使用静态库中的函数

它是一种使用静态lib函数的方法,如果我没有头文件,只有*.a文件,但我知道函数签名?

c c++ static-libraries

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