小编Sha*_*baz的帖子

正确导出Linux标头,模块

在树中构建内核驱动程序时,我在drivers目录中运行make,这里KERNELDIR是内核源代码的路径,或者是头文件.

make -C $(KERNELDIR) M=$(PWD) modules
Run Code Online (Sandbox Code Playgroud)

在尝试使用以下方法构建标头时:

make headers_install ARCH=i386 INSTALL_HDR_PATH=$(HEADERSDIR)
Run Code Online (Sandbox Code Playgroud)

我觉得不适合出口建立一个反模块(不完整的内核源代码树)的几个文件和文件夹似乎丢失,就像一个Makefile文件,脚本,include/generated/autoconf.hinclude/config/auto.conf

Debian以一种可用的方式处理事务,如rules.real中所描述的那样,尽管它的描述不仅仅是描述的Documentation/make/headers_install.txt,似乎不是"标准"方式.

简而言之:我如何正确导出linux头文件,以便我可以针对它构建外部模块?

linux kernel module header

7
推荐指数
2
解决办法
4718
查看次数

是否可以在一次操作中应用两个匹配的模式转换?

我有一个填充了文件名和路径的bash变量:

SONG="~/Music/Mine/Cool Title Bro.flac"
Run Code Online (Sandbox Code Playgroud)

在我尝试使标记变得更加容易的过程中,我对变量应用了一些转换以隔离标题:

echo "${SONG#\~/Music/Mine/}" # which prints: Cool Title Bro.flac
Run Code Online (Sandbox Code Playgroud)

我知道也可以删除后缀${SONG%%.flac}.

但是,是否可以在单个操作中删除前缀和后缀?

这个:

${SONG#\~/Music/Mine/%%.flac}
Run Code Online (Sandbox Code Playgroud)

大概是因为它试图将文字%%.flac作为前缀的一部分进行匹配.反过来不起作用(%%.flac#~/[...]),我甚至疯了似试

${${SONG#~/Music/Mine/}%%.flac}
Run Code Online (Sandbox Code Playgroud)

这也行不通.

这可能是我工程过度工程的一个主要例子,但是如果有办法做到这一点并且我还没有弄清楚它会很好.

bash shell

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

usb磁盘写入延迟(windows)

我正在从最低优先级的线程写入USB磁盘,使用分块缓冲区写入,但仍然有时系统整体滞后于此操作.如果我只禁用写入磁盘,一切正常.我不能使用Windows文件操作API调用,只能写C.所以我想也许有一个WinAPI函数来打开/关闭USB磁盘写缓存,我可以结合使用FlushBuffers或类似的替代方案?操作的驱动器数量未定义.

理想情况下,我希望永远不会使用写调用和缓存,如果它将透明地执行也是可以的.

编辑:_O_SEQUENTIAL在只写操作上标记在这里有用吗?

c c++ windows usb winapi

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

libpng 1.5.10错误:解除引用指向不完整类型的指针

png_read_info (png_ptr, info_ptr);
{ 
    png_byte color_type = info_ptr->color_type;
    png_byte bit_depth  = info_ptr->bit_depth;
    ...
Run Code Online (Sandbox Code Playgroud)

我得到的最后两行

错误:取消引用指向不完整类型的指针

怎么了?在libpng 1.4中,这总是好的.

c libpng

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

`char*array [size]`和`extern char**array`连接错误?

首先,看看这个例子(我为了举例而做了这个,它不是一个真正的程序):

whatever.h

#ifndef WHATEVER_H
#define WHATEVER_H

void fill(void);

#endif
Run Code Online (Sandbox Code Playgroud)

main.c中

#include <stdio.h>
#include "whatever.h"

char *names[10] = {NULL};

int main()
{       
        int i; 
        fill(); 
        for (i = 0; i < 10; ++i)
                printf("%s\n", names[i]);
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

whatever.c

#include "whatever.h"

extern char **names;

void fill(void)
{
        int i;
        for (i = 0; i < 10; ++i)
                names[i] = "some name";
}
Run Code Online (Sandbox Code Playgroud)

当我使用以下程序制作此程序:

gcc -o test main.c whatever.c -Wall -g
Run Code Online (Sandbox Code Playgroud)

我没有收到任何错误或警告.但是,当我运行程序时,我看到了fill,names实际上是NULL.如果在whatever.c我改变

extern char …
Run Code Online (Sandbox Code Playgroud)

c gcc linkage

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

const string加上布尔值在C中复数

我很惊讶string plus boolean有类似三元操作的效果:

int apple = 2;                                                                      
printf("apple%s\n", "s" + (apple <= 1));
Run Code Online (Sandbox Code Playgroud)

如果apple <= 1,它将打印苹果.为什么这样做?

c string boolean plural

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

scan中的扫描集行为

我试图在scanf中使用scanset做一些东西但是卡在某处.

我写的时候

char s1[250];
scanf("%[A-Z]s",s1);

input : AHJHkiuy
Output: AHJH
Run Code Online (Sandbox Code Playgroud)

有了这个,

scanf("%[^\n]s",s1);

input: abcd ABCD hie
output: abcd ABCD hie       /*that is reading white space also (till \n) */
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,如果我提供输入:

ABCDahaj ahajABCD ajak12347ab
Run Code Online (Sandbox Code Playgroud)

并希望输出为:

ABCDahaj ahajABCD ajak
Run Code Online (Sandbox Code Playgroud)

那么格式字符串应该如何写?也就是说,如何使用这个扫描设备?

c scanf

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

显示有序的VIM键盘映射

有没有显示我当前vim环境的所有键盘映射的有序列表,如下所示:

a: append
b: back one word
c: ...
.
.
.

---- Ctrl mappings ----
<C-a> (I dont know...)
.
.
.
<C-p> Default mode for CrtlP
...

---- Alt mappings ----
...
Run Code Online (Sandbox Code Playgroud)

这对我来说非常有用.

vim

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

允许在c ++函数上使用extern"C"吗?

可能重复:
在C++源代码中,extern"C"的作用是什么?

我问这个是因为我正在编写一个使用C库的C++程序.该库具有foreach回调(自然)的功能.显然,库会将我的回调称为C函数.

首先,这与C与C++的链接有什么关系?

如果确实如此,这样的有效和正确吗?

extern "C" static bool callback(/*parameters*/)
{
    cout << "C++ thing inside the function" << endl;
    /* etc */
}
Run Code Online (Sandbox Code Playgroud)

c++

6
推荐指数
0
解决办法
333
查看次数

在预处理器中从常量中删除强制转换

背景

在微控制器代码中,我使用的是生产者提供的库,其中定义了许多常量.如果我的一些常量(与微控制器外部的组件共享git-subtree)和微控制器常量之间存在不匹配,我试图给出错误.

例如,库定义:

#ifdef SOME_PARTICULAR_MODEL
#define FLASH_BLOCK_SIZE ((uint8_t)64)
/* else, other models */
#endif
Run Code Online (Sandbox Code Playgroud)

在某处,在微控制器代码和PC上编译的一些代码之间共享的标题中,我有例如:

#define MYPROG_BLOCK_SIZE 64
Run Code Online (Sandbox Code Playgroud)

为了确保这些常量匹配,在微控制器代码中,两个常量都存在,我有:

#if MYPROG_BLOCK_SIZE != FLASH_BLOCK_SIZE
#error "mismatch between actual block size and defined block size"
#endif
Run Code Online (Sandbox Code Playgroud)

这是为了确保代码是否曾被移植到更大的微控制器,共享头也将被更新.

问题

问题是这会减少到:

#if 64 != ((uint8_t)64)
Run Code Online (Sandbox Code Playgroud)

我不确定它是否是有效的C,但仍然使编译器窒息.测试时,我发现问题不在于它uint8_t是一个typedef而且它仍然会被一个强制转换扼杀到int例如.

问题

有没有办法(uint8_t)从定义为的值中删除该部分((uint8_t)64)?如果没有,有没有办法改变它,所以表达式变成一个没有演员?

我考虑过定义uint8_t为某种东西并在之后取消定义#if,但我无法弄清楚如何避免其演员性质(Y)X并将其转化为算术表达式.

c primitive-types c-preprocessor

6
推荐指数
2
解决办法
1815
查看次数

标签 统计

c ×6

c++ ×2

bash ×1

boolean ×1

c-preprocessor ×1

gcc ×1

header ×1

kernel ×1

libpng ×1

linkage ×1

linux ×1

module ×1

plural ×1

primitive-types ×1

scanf ×1

shell ×1

string ×1

usb ×1

vim ×1

winapi ×1

windows ×1