#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) 我担心我已经知道答案,但我想确定......
我有一个相当大的项目,其头文件类型为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格式字符串似乎令人生畏).
假设我有一个比特流,其中包含8位数据,后跟2个奇偶校验位(模式重复).
示例(x是奇偶校验位):
0001 0001 xx00 0100 01xx 0001 0001 xx00 ...
应该成为
0001 0001 0001 0001 0001 0001 ...
我觉得这应该很容易,我只是在考虑它,但你如何去剥离这些奇偶校验位呢?
我一直在做一些模块工作,并且崩溃是随机发生的(通常在启动后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的时间(肯定不是原子的,对吧?)。是什么原因造成的?
我认为这篇文章是长篇大论,但是我现在真的只是在寻找任何需要解决的问题。