小编cal*_*doa的帖子

您对大项目的首选C/C++标头策略?

在处理大型C/C++项目时,您是否对源文件或头文件中的#include有一些特定规则?

例如,我们可以想象遵循这两个过多的规则之一:

  1. .h文件中禁止使用#include ; 每个.c文件都包含它需要的所有头文件
  2. 每个.h文件应包含其所有依赖项,即它应该能够单独编译而不会出现任何错误.

我想在任何项目之间存在权衡,但你的是什么?你有更具体的规则吗?或任何解决任何解决方案的链接?

c c++ coding-style header include

48
推荐指数
5
解决办法
8427
查看次数

如何以特定顺序生成包含扩展的列表?

我知道如何通过这种方式轻松生成列表:

echo {a,b,c,d}_{0..3}

这会给:

a_0 a_1 a_2 a_3 b_0 b_1 b_2 b_3 c_0 c_1 c_2 c_3 d_0 d_1 d_2 d_3

但是如何生成相同的列表,但第二个大括号的优先级更高,以获得这个?:

a_0 b_0 c_0 d_0 a_1 b_1 c_1 d_1 a_2 b_2 c_2 d_2 a_3 b_3 c_3 d_3

任何技巧,比如从末尾或字符n中排序都可以,只要它适合一行.我也在使用zsh,但使用bash的东西很好.

bash zsh

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

未解析弱函数的 GCC 行为

考虑下面的简单程序:

__attribute__((weak)) void weakf(void);

int main(int argc, char *argv[])
{
        weakf();
}
Run Code Online (Sandbox Code Playgroud)

当用 gcc 编译它并在 Linux PC 上运行它时,它会出现段错误。在 ARM CM0 (arm-none-eabi-gcc) 上运行它时,链接器通过跳转到以下指令和 nop 替换未定义的符号。

这种行为记录在哪里?是否有可能通过命令行选项更改它?我已经通过GCCLD文档,没有关于这方面的信息。

但是,如果我检查 ARM 编译器文档,则会清楚地解释这一点

c gcc arm ld weak

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

将模块移植到较新的Linux内核:无法分配内存

我有一个非常大的驱动程序模块,我正在尝试编译最近的Linux内核(3.4.4).我可以insmod使用2.6.27.25内核成功编译和使用相同的模块.GCC版本也不同,4.7.0对4.3.0.请注意,此模块非常复杂,我不能简单地浏览所有代码和所有makefile.

当"插入"模块时,我得到一个Cannot allocate memory带有以下痕迹:

vmap allocation for size 30248960 failed: use vmalloc=<size> to increase size.
vmalloc: allocation failure: 30243566 bytes
insmod: page allocation failure: order:0, mode:0xd2
Pid: 5840, comm: insmod Tainted: G           O 3.4.4-5.fc17.i686 #1
Call Trace:
 [<c092702a>] ? printk+0x2d/0x2f
 [<c04eff8d>] warn_alloc_failed+0xad/0xf0
 [<c05178d9>] __vmalloc_node_range+0x169/0x1d0
 [<c0517994>] __vmalloc_node+0x54/0x60
 [<c0490825>] ? sys_init_module+0x65/0x1d80
 [<c0517a60>] vmalloc+0x30/0x40
 [<c0490825>] ? sys_init_module+0x65/0x1d80
 [<c0490825>] sys_init_module+0x65/0x1d80
 [<c050cda6>] ? handle_mm_fault+0xf6/0x1d0
 [<c0932b30>] ? spurious_fault+0xae/0xae
 [<c0932ce7>] ? do_page_fault+0x1b7/0x450
 [<c093665f>] sysenter_do_call+0x12/0x28
-- clip --
Run Code Online (Sandbox Code Playgroud)

显而易见的答案似乎是模块分配了太多内存,但是:

  • 我对旧内核版本没有任何问题,这个模块的大小
  • 如果我修剪这个模块的某些部分以获得更低的内存消耗,我会得到与新内核相同的错误消息
  • 我可以卸载很多其他模块,但它没有任何影响(并且无论如何相关?Linux是否存在关于模块总内存使用量的全局限制)

因此,我怀疑新内核的问题与有限的内存没有直接关系.

新内核抱怨 …

c kernel insmod linux-kernel vmalloc

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

调整 Android 12 以从普通应用程序访问 SD 卡文件

我最近购买了搭载 Android 12 的三星 Galaxy S20 FE,我很快注意到许多应用程序无法访问 SD 卡上的文件。例如,我曾经从不同的浏览器或音乐播放器访问本地 HTML/MP3 文件。在我的新系统上,这些应用程序可以查看文件夹并浏览它们,但无法打开甚至列出任何常规文件。有一些例外,例如 Total Commander 或 AIMP。

据我了解,这是 Google 的一项政策更改,出现在 Android 11 (API/SDK 30) 上:https ://www.xda-developers.com/android-11-all-files-access-permission-form/

我尝试了一些可以在网上找到的解决方案,例如:
pm grant com.XXX.YYY android.permission.MANAGE_EXTERNAL_STORAGE
appops set --uid com.XXX.YYY android:legacy_storage allow

这不起作用,因为应用程序(我尝试使用 Opera)可能在安装过​​程中没有请求此权限。此外,我能找到的大多数解决方案都与正在开发的应用程序相关,而不是从商店安装的应用程序。例如:Android 11 范围存储权限

我可以找到的一个解决方法是将所有文件移入/storage/SD_CARD_ID/Android/data/com.XXX.YYY/files,但是,这意味着每次安装新应用程序以及我使用的每个应用程序时都必须复制这些文件,如果我有 GB 的 MP3 或其他文件,这是非常愚蠢的媒体。在 URL 栏中输入完整路径也非常繁琐,因为无法轻松导航到或打开此文件夹。

因此,我试图找到一种方法来默认为所有应用程序启用权限,或者至少找到一种通过 GUI 来执行此操作的简单方法。例如,我尝试/etc/permissions/platforms.xml进行一些或多或少的随机尝试进行调整,因为我找不到有关该文件语法的任何文档,但没有任何效果。

请注意,我的手机已root。

permissions android android-sdcard

5
推荐指数
0
解决办法
5030
查看次数

DOS到UNIX文件中的路径替换

我有一个包含这种路径的文件:

C:\bad\foo.c
C:\good\foo.c
C:\good\bar\foo.c
C:\good\bar\[variable subdir count]\foo.c
Run Code Online (Sandbox Code Playgroud)

我想得到以下文件:

C:\bad\foo.c
C:/good/foo.c
C:/good/bar/foo.c
C:/good/bar/[variable subdir count]/foo.c
Run Code Online (Sandbox Code Playgroud)

请注意,不应修改非匹配路径.

我知道如何使用sed固定数量的子目录中做到这一点,但一个变量号给我找麻烦.事实上,我将不得不使用许多s/x/y/表达式(多达最大深度...不是很优雅).

可能是awk,但这种魔法超出了我的技能.

仅供参考,我需要这个技巧来纠正cygwin平台上的一些gcov二进制文件.


我正在处理二进制文件; 因此,我可能会有以下类型的数据:

bindata\bindata%bindataC:\good\foo.c
Run Code Online (Sandbox Code Playgroud)

应翻译为:

bindata\bindata%bindataC:/good/foo.c
Run Code Online (Sandbox Code Playgroud)

第一个\不得翻译,尽管它是在同一条线上.

但是,我.gcno在编辑此文本时检查了我的文件,看起来所有路径都是零,所以下面的大多数答案都应该适合.

awk cygwin sed gcov lcov

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

Linux C调试库检测内存损坏

有时以前在带有简单MMU的嵌入式系统上工作时,我曾经动态编程这个MMU以检测内存损坏.

例如,在运行时的某个时刻,foo变量被一些意外数据覆盖(可能是通过悬空指针或其他任何东西).所以我添加了额外的调试代码:

  • 在init,foo使用的内存被指示为MMU的禁区;
  • 每当foo被故意访问时,就可以在之前禁止访问该区域;
  • 添加了MMU irq处理程序以转储主服务器和负责违规的地址.

这实际上是某种观察点,但直接由代码本身自行处理.

现在,我想重用相同的技巧,但在x86平台上.问题是我很难理解在这个平台上如何使用MMU,以及Linux如何使用它,但我想知道是否已经存在任何库/工具/系统调用来处理这个问题.

请注意,我知道存在各种工具,如Valgrind或GDB来管理内存问题,但据我所知,这些工具都不会被调试代码动态重新配置.

我主要对Linux下的用户空间感兴趣,但也欢迎任何关于内核模式或Windows下的信息!

c linux debugging memory-management watchpoint

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

Python:最简单的方法来压缩包含函数中另一个tupple的tupple

我的代码是这样的:

def f1():
    return 2, 3

def f2():
    return 1, f1()
Run Code Online (Sandbox Code Playgroud)

我可以:

a, (b, c) = f2()
Run Code Online (Sandbox Code Playgroud)

我想要做:

a, b, c = f2()
Run Code Online (Sandbox Code Playgroud)

我能找到的所有解决方案都需要使用大量疯狂的括号/括号,或创建一个使用*运算符的标识函数.我想只修改f2().

有什么比这更简单的了吗?

python tuples unpack

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

ARM Cortex M 的 gcc 不支持 FPU?

我从一个众所周知的基准测试中得到了以下函数,我正在使用它进行编译gcc-arm-none-eabi-10-2020-q4-major

#include <unistd.h>

double b[1000], c[1000];

void tuned_STREAM_Scale(double scalar)
{
    ssize_t j;
    for (j = 0; j < 1000; j++)
        b[j] = scalar* c[j];
}
Run Code Online (Sandbox Code Playgroud)

我正在使用以下编译器选项:

arm-none-eabi-gcc -O3 -mcpu=cortex-m7 -mthumb -mfloat-abi=hard -mfpu=fpv5-sp-d16 -c test.c

但是,如果我检查编译后的代码,编译器似乎无法使用基本的 FPU 乘法指令,而仅使用以下函数__aeabi_dmul(但是我们可以看到使用了libgccFPU ):vmov

00000000 <tuned_STREAM_Scale>:
   0:   e92d 41f0       stmdb   sp!, {r4, r5, r6, r7, r8, lr}
   4:   4c08            ldr     r4, [pc, #32]   ; (28 <tuned_STREAM_Scale+0x28>)
   6:   4d09            ldr     r5, [pc, #36]   ; (2c <tuned_STREAM_Scale+0x2c>)
   8:   f504 58fa       add.w …
Run Code Online (Sandbox Code Playgroud)

floating-point gcc fpu cortex-m

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

如何定义地址为null的对象?

我想知道如何在C中定义一个对象,其引用将为null?

// definition of foo 
...
void * bar = &foo; // bar must be null
Run Code Online (Sandbox Code Playgroud)

有一些方法我可以找到它,但没有一个符合我的需要.

__attribute__((weak)) extern int foo; //not working with cygwin/gcc 3.4
__attribute__((at(0))) int foo;       //only with rvds
#define foo (*(int*) 0)               //cannot be embedded in a macro
Run Code Online (Sandbox Code Playgroud)

实际上,我更喜欢符合标准的解决方案(c99),但任何正常工作都可以.


编辑:这样做的原因是bar不会总是为空.这是一个更相关的例子:

// macro that will define foo to a real object or to *null
DECL(foo);

int * bar = &foo;

if(bar) {
  // we can call func
  func(bar);
} else {
  // bar undefined
  exit(-1);
}
Run Code Online (Sandbox Code Playgroud)

当然这仍然不是很相关,因为我可以在我的条件下使用#if.该项目实际上涉及大型结构,大量文件,一些编译器,一些cpu目标,以及许多程序员,他们生成的错误概率指数与他们使用的语法的复杂性呈指数关系.这就是为什么我想要一个简单的宏来声明我的foo对象.

c c++ linker weak-references

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