小编ugo*_*ren的帖子

Python ncurses,CDK,urwid的区别

这3个有什么区别?据我所知,它们都提供了对curses的绑定,这是基于终端文本的UI的C库.

我目前不知道3中的任何一个,我从未使用过诅咒.你会推荐哪一个?我听过多次ncurses,但只听过一次或两次CDK(通过研究),从未听说过urwid(我认为).

python curses ncurses urwid

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

可以使用代码块作为C宏的参数吗?

我有一个模式,基本上是一些样板代码,其中一部分在中间变化

if(condition){
    struct Foo m = start_stuff();
    { m.foo = bar(1,2); m.baz = 17; } //this part varies
    end_stuff();
}
Run Code Online (Sandbox Code Playgroud)

是否可以使宏taht将该中间代码块作为参数?C中的宏扩展规则看起来非常复杂,所以我不确定将来是否会出现任何可能出现并且咬我的角落情况(特别是,我不明白如果我的代码如何分离宏参数有逗号).

#define MY_MACRO(typ, do_stuff) do { \
    if(condition){ \
        struct typ m = start_stuff(); \
        do_stuff; \
        end_stuff(); \
    } \
}while(0)

//usage
MY_MACRO(Foo, {
   m.foo = bar(1,2);
   m.baz = 17;
});
Run Code Online (Sandbox Code Playgroud)

到目前为止,我设法想到的唯一一件事就是如果我在宏中使用循环语句breakcontinue被捕获,这对我的特定用例来说是一个可接受的权衡.

编辑:当然,如果可以的话,我会使用一些功能.我在这个问题中使用的示例是简化的,并没有展示只能用于宏魔术的位.

c macros nesc

18
推荐指数
2
解决办法
7626
查看次数

禁用默认警告的警告/错误

我们想要开始使用-Wall -Werror大型项目.
由于尺寸的原因,这种变化必须分阶段进行,我们首先要从最重要的警告开始.

最好的方法似乎是使用-Wall -Werror,特殊警告的例外情况.特别的警告是我们有很多(因此修复所有这些都很难和冒险),我们认为它们不是很危险.
我不是说我们不想解决所有这些警告 - 只是没有在第一阶段.

我知道有两种方法可以排除警告-Werror- 最好的是-Wno-error=xxx,如果它不起作用 - -Wno-xxx(当然,我们更愿意看到警告并忽略它,而不是隐藏它).

我的问题是默认情况下启用的警告,并且没有-Wxxx与它们相关的标志.使用时我找不到任何方法来全部使用它们-Werror.

我特别关注两个具体的警告.这是一个展示它们和编译器输出的程序:

#include <stdio.h>
void f(int *p) { printf("%p\n", p); }

int main(int argc, char *argv[]) {
        const int *p = NULL;
        const unsigned int *q = NULL;
        f(p);           /* Line 7: p is const, f expects non const */
        if (p == q) {   /* Line 8: p is signed, q is unsigned */ …
Run Code Online (Sandbox Code Playgroud)

c gcc suppress-warnings

13
推荐指数
1
解决办法
1076
查看次数

Python控制台UI建议

我目前正在重写一个使用curses的perl控制台应用程序,并计划在Python中实现它.到目前为止,我已经将我的库选项缩小到直接curses,urwid和dialog.

该应用程序基本上是一个适用于基本配置(网络选项,主机名等)的设备的安装程序.其中一个是否有任何建议或拥护者?urwid或对话有任何严重的限制吗?

python curses console-application urwid

10
推荐指数
1
解决办法
1249
查看次数

将参数从csh传递给程序,就像它们一样

我有一个csh脚本,使用"source"执行,并将其所有参数传递给程序:

% alias foo source foo.csh
% cat foo.csh
./bar $*
# Some uninteresting stuff
Run Code Online (Sandbox Code Playgroud)

如果我跑source foo.csh a b c,一切都好.但不总是:

  1. foo "a b" "c d":
    我希望bar得到两个论点 - a bc d.相反,它得到4.

  2. foo a "*" b:它*被扩展为文件列表.我只想要这个角色*.
    额外的功劳 - foo a * b应该以同样的方式工作.我知道这更有问题,我愿意没有它.

有一件事我试着在改变./bar $*./bar "$*".这有助于星号,但现在bar总是在一个参数中获取所有内容.

笔记:

  1. 我们公司使用csh作为登录shell,所以我必须在使用时使用它source.知道csh编程被认为是有害的,我实现了所有逻辑bar并在脚本中保留了最低限度.

  2. 如果你建议重新定义别名,重要的是看到重定向仍然有效(foo | grep hello),并且如果ctrl-C破坏了脚本,那么正确清理.

谢谢.

linux csh

9
推荐指数
1
解决办法
8375
查看次数

指向匿名联盟成员的指针是否相等?

C++ 11允许在函数中定义匿名联合,并且可以将其成员作为函数的变量进行访问.如果我检查指向不同成员的指针,它们是相同的,但==运算符说它们是不相等的.

这种奇怪的行为通常是未定义行为的结果,但我在代码中看不到任何未定义的内容(我确保两个成员属于同一类型).

如果我使用未命名联合类型的命名变量,则行为会有所不同.在这种情况下,指针比较相等.

该程序演示了两种情况:

#include <iostream>
using namespace std;

#ifdef NAMED
// Create a named object of a union type
#define NAME n
#define ADDR(mem) &(NAME.mem)
#else
// Create an anonymous union in main()
#define NAME
#define ADDR(mem) &mem
#endif

int main()
{
    union {
        int a;
        int b;
    } NAME;

    cout << "&a = " << ADDR(a) << endl;
    cout << "&b = " << ADDR(b) << endl;
    cout << "(&a==&b) = " << (ADDR(a) == …
Run Code Online (Sandbox Code Playgroud)

c++ pointers unions c++11

6
推荐指数
1
解决办法
273
查看次数

调试链接警告“符号类型与原始声明不匹配”

我正在尝试系统地调试以下问题:

% gcc -fPIC -flto -o try1.o -c try1.c
% gcc -fPIC -flto -o try2.o -c try2.c
% gcc -shared -flto -fPIC -o try.so try1.o try2.o
try2.c:1:14: warning: type of 'aaaaaaaa' does not match original declaration [enabled by default]
try1.c:1:5: note: previously declared here
Run Code Online (Sandbox Code Playgroud)

在这个综合测试中,我确切地知道了问题所在- 在这里aaaaaaaa定义int,但是short在那里。在我真正的问题中,链接组合了许多对象,这些对象是复杂的构建过程的结果,而且我不知道哪两个对象包含冲突的定义。

我想通过检查每个链接的目标文件来解决它,看看每个文件中如何定义符号,并找到一对定义不匹配的文件。然后,我将跟踪构建过程,以了解它们是如何构建的,并找到根本原因。但是我不知道查看对象定义方式的方法。

我尝试了nm -Aobjdump -t,但是它们没有显示符号类型/大小:

% nm -A try1.o
try1.o:00000001 C __gnu_lto_v1
try1.o:00000000 D aaaaaaaa
% nm -A try2.o
try2.o:00000001 C __gnu_lto_v1
try2.o:         U aaaaaaaa …
Run Code Online (Sandbox Code Playgroud)

c gcc linkage lto

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

查找谁在 ELF 文件中使用符号

我有一个包含符号的大二进制文件。我可以在nm或 中看到符号objdump
我知道使用了该符号,否则链接器不会包含它(更准确地说,我知道使用了同一源文件中的某些符号)。
我试图找出它的使用方式。

如果引用是通过函数(例如函数调用函数,使用全局变量的函数),我可以使用objdump -rd反汇编文件并找到引用。
但是如果引用是由一个变量(例如一个全局指针初始化为指向某个变量),反汇编不会显示它。
我没有找到任何可以做到的方法。

这是一个演示它的示例。在这个例子中,很明显谁使用了x,但我不知道如何检查生成的二进制文件并找到它。

// x.c
int x = 3;

// main.c
extern int x;
static int *y = &x;
int main() { 
    return *y;
}

// Build process
gcc -o x.o -c x.c
ar r libx.a x.o
gcc -o main.o -c main.c
gcc -o main main.o -L. -lx
Run Code Online (Sandbox Code Playgroud)

c linux elf linkage

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

在'...'标记之前预期的primary-expression调用模板化类的模板化方法

我在模板化的类中有一个模板化的静态方法,我从模板化的函数中调用它.编译因错误而失败error: expected primary-expression before '...' token.

这是一个示例代码.它有一些未使用的模板参数,但与我的实际代码完全相同,其中这些参数很重要.

temp late<typename T>
class Run {
public:
    template<typename ...Args>
    static void run(Args... args) {}
};

template <typename T, typename ...Args>
void
run2(Args ...args)
{
    Run<int>::run<Args...>(args...);   // OK
    Run<T>::run<Args...>(args...);     // Fail on first . in Args...
}

int main() {
    run2<int>(1, 2, 3);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译错误:

%  g++ -std=gnu++11 -o try try.cc
try.cc: In function 'void run2(Args ...)':
try.cc:13:21: error: expected primary-expression before '...' token
     Run<T>::run<Args...>(args...);     // Fail on first . …
Run Code Online (Sandbox Code Playgroud)

c++ templates c++11

0
推荐指数
1
解决办法
60
查看次数