小编jos*_*sec的帖子

这个陈述是如何评估的,这是什么叫做?

#define FOO(val) \
({                                              \
   int b = val;                                 \
   printf("First, let's count to %d\n", val);   \
   for (int i = 1; i <= val; i++) {             \
      printf("%d...\n", i);                     \
   }                                            \
   b++;                                         \
   b;                                           \
})

int main() {
   int a = FOO(6);
   printf("a=%d\n", a);

   a = (4);     // straightforward, everyone should be familiar with this
   a = (4;);    // does not compile
   a = { 4; };  // does not compile
   a = ({ 4;}); // valid, …
Run Code Online (Sandbox Code Playgroud)

c gcc

9
推荐指数
2
解决办法
925
查看次数

你如何处理在平台之间切换的整数的原生大小?

我担心我已经知道答案,但我想确定......

我有一个相当大的项目,其头文件类型为typedefs native types:

typedef unsigned long int    u32;
typedef signed long int      s32;
// etc...
Run Code Online (Sandbox Code Playgroud)

不可避免的事情发生了,我现在正在尝试编译long64位而不是32位的系统.修复它的最佳方法是什么?

我可以typedef在上面int(或int32_t/ uint32_t从stdint.h),这将满足在平台上的32位大小我知道,但这似乎仍值得怀疑.使用printf样式函数也存在问题%ld(编译器抱怨并希望看到%d).这些都必须改变,不是它们(也许是inttypes.h中的定义)?

这似乎很简单但我想在开始深入研究之前确定(修复printf格式字符串似乎令人生畏).

c c++ portability

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

在C中剥去奇偶校验位

假设我有一个比特流,其中包含8位数据,后跟2个奇偶校验位(模式重复).

示例(x是奇偶校验位):

0001 0001 xx00 0100 01xx 0001 0001 xx00 ...

应该成为

0001 0001 0001 0001 0001 0001 ...

我觉得这应该很容易,我只是在考虑它,但你如何去剥离这些奇偶校验位呢?

c

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

是什么会导致preempt_count更改或使工作队列在原子上下文中运行?

我一直在做一些模块工作,并且崩溃是随机发生的(通常在启动后10小时内)。

从一次崩溃到下一次崩溃,内核日志消息可能有所不同,但是在某些情况下,我得到以下信息:

<4>huh, entered c90390a8 with preempt_count 0000010d, exited with c0340000?
Run Code Online (Sandbox Code Playgroud)

生成此日志的代码来自2.6.14内核kernel / timer.c:

            int preempt_count = preempt_count();
            fn(data);
            if (preempt_count != preempt_count()) {
                printk(KERN_WARNING "huh, entered %p "
                       "with preempt_count %08x, exited"
                       " with %08x?\n",
                       fn, preempt_count,
                       preempt_count());
                BUG();
            }
Run Code Online (Sandbox Code Playgroud)

为了使这种情况发生,必须发生什么(显然preempt_count已更改,但是可能导致该情况)?

崩溃的另一个症状是,我scheduling while atomic在工作队列中看到i2c的时间(肯定不是原子的,对吧?)。是什么原因造成的?

我认为这篇文章是长篇大论,但是我现在真的只是在寻找任何需要解决的问题。

linux-kernel

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

标签 统计

c ×3

c++ ×1

gcc ×1

linux-kernel ×1

portability ×1