小编Mar*_*ark的帖子

C语言:递归#include

我遇到了这样一段代码:

啊:

#include "b.h"
/* structure definitions, macros etc. */
Run Code Online (Sandbox Code Playgroud)

BH:

    #include "a.h"
/* structure definitions, macros etc. */
Run Code Online (Sandbox Code Playgroud)

从C标准来看这是合法的吗?我认为这种方法并不安全.

c programming-languages

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

许多小型功能

在计算机文献中,通常建议尽可能多地编写短函数.我知道它可能会增加可读性(虽然并非总是如此),这种方法也提供了更大的灵活性.但它与优化有关吗?我的意思是 - 编译器编译一堆小例程而不是几个大例程是否重要?

谢谢.

c compiler-construction optimization

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

重新定义枚举值

我在我正在使用的第三方库中定义了此代码:

typedef enum {
   STATE_INITIAL  = 0,
   STATE_LOAD     = 1,
   STATE_READ     = 2,
   STATE_FINISH   = 3
} state_t;
Run Code Online (Sandbox Code Playgroud)

我想重新定义STATE_FINISH的值.但是,我不想搞乱这个库,同时我不能在我的代码中这样做:

#undef STATE_FINISH
#define STATE_FINISH 2
Run Code Online (Sandbox Code Playgroud)

还有另外一种方法吗?

c types typedef

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

eBPF:在 Linux 命名空间中运行

所以BPF程序是内核实体,因为它们在内核空间中运行。另一方面,Linux 命名空间又名容器,提供应用程序级别的隔离,在这种情况下,它们都共享主机的内核、内核模块等。

所以我想bpf每个容器加载一个程序是没有意义的,因为它也会在主机上可见?

因此,我猜测bpf程序会加载到主机和监视器/损坏/等上。进出命名空间的数据包。鉴于struct sock有关于命名空间 id 的信息,我认为只有某些类型的bpf程序才能做到这一点?

bpf linux-namespaces ebpf

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

指针大小和Pass-by-Reference与Pass-by-P​​ointer

我有两个问题:

  1. 我是对的,在4位系统上,指针是4个字节吗?

  2. 是"通过引用传递"和"通过指针传递相同的东西,只是不同的措辞?

c c++ sizeof pass-by-reference pass-by-pointer

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

if-else或switch-case的最快替代品

我有以下定义:

typedef enum
{
    def   = 0,
    m1    = 1,
    m2    = 2,
    m3    = 4,
    m4    = 6,
    m5    = 17,
    m6    = 33,
    m7    = 41,
    m8    = 47,
    m9    = 50,
    m10   = 51,
    m11   = 58,
    m12   = 89,
    m13   = 132,
    m14   = 135
} my_enums;
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种最快的方法来检查函数的参数是否属于其中一个值m1..m14.显而易见的实现是if(p == m1 || p == m2 ...)或switch-case alternative.

有更快的东西吗?m1~m14的值是固定的,不能在连续的范围内.

谢谢.

c algorithm

0
推荐指数
2
解决办法
1086
查看次数

在命名空间中定义一个函数

namespace n1 {
  namespace n2 {
    ...
    int myfunc(void)
      {
         return 1;
      }
    class myclass {
      ..
    };
  }
}
Run Code Online (Sandbox Code Playgroud)

我认为可以用这种方式定义一个函数,并从'myclass'及其派生词中访问它.但是gcc甚至不想编译这段代码:

multiple definition of `n1::n2::myfunc()'
Run Code Online (Sandbox Code Playgroud)

这个功能是这里唯一的一个,我错过了什么?谢谢.

c++ namespaces

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

netlink和通用netlink协议

我已经阅读了通用的netlink方法,我发现netlink的唯一主要缺点是协议系列的数量仅限于MAX_LINKS(32),因此他们创建了通用的netlink协议.这是唯一的原因吗?这是否意味着,它建议使用genl而不是netlink,例如作为用户和内核空间之间的通信?genl被认为是一种更具可扩展性和可管理性的传统网络链接吗?

谢谢.

linux-kernel netlink

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

select() 是阻塞调用还是非阻塞调用

select()当它传递struct timeval带有超时值的参数时,可以说它是非阻塞的吗?当该参数为 NULL 时,它是阻塞的。

sockets linux nonblocking blocking

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

比较 ifdef 指令中的字符串

我在编译过程中传递了一个 macto:

% gcc -DIDENT="abcd" app.c

在编译宏期间检查的正确方法是什么?例如下面的工作,但抛出警告:

#ifdef IDENT == "abcd"
printf("abcd\n");
#endif
Run Code Online (Sandbox Code Playgroud)

警告:#ifdef 指令末尾的额外标记。

c macros conditional-compilation

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