当我__attribute__第一次看到这个关键字时,我得到了一个 C 程序。看起来它是一个 GNU 关键字。在 GCC 的this page中,他们用该(vector_size(16))属性解释了它的用法,说:
int foo __attribute__ ((vector_size (16)));导致编译器将 foo 的模式设置为 16 字节,分为 int 大小的单元。假设是一个32位int(4个单位4个字节的向量),foo对应的模式将是V4SI。
这是什么意思?foo现在声明为 4 元素整数数组吗?如果是这样,那么有什么问题:
int foo[4];
?
阅读gcc的手册,我看到了一系列-ftree-***优化选项.这些选择的目的是什么?这些"树"是什么?
我试图获得一个宽度为8的浮动的长2D阵列的格式化打印.使用x命令时,我将数组打印为四列表:
(gdb) x/16f 0x81000000
0x81000000: 0 0 1 0
0x81000010: 2 0 3 0
0x81000020: 4 0 5 0
0x81000030: 6 0 7 0
Run Code Online (Sandbox Code Playgroud)
使用该p命令时,我得到一个未格式化的输出,终端的宽度:
(gdb) p/f *(0x81000000)@16
$27 = {0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0}
Run Code Online (Sandbox Code Playgroud)
必需的输出,如:
(gdb) x/16f 0x81000000
0x81000000: 0 0 1 0 2 0 3 0
0x81000020: 4 0 5 0 6 0 7 0
Run Code Online (Sandbox Code Playgroud)
要么:
(gdb) p/f *(0x81000000)@16
$27 = {0, 0, …Run Code Online (Sandbox Code Playgroud) 我正在写一个C(共享)库.它起初是一个单独的翻译单元,我可以在其中定义几个static全局变量,以便从外部模块中隐藏.
现在库已经增长,我想将模块分解为几个较小的源文件.问题是现在我有两个选项用于提到的全局变量:
在每个源文件中都有私有副本,并通过函数调用以某种方式同步它们的值 - 这将非常快速地变得非常丑陋.
删除static定义,因此变量在所有翻译单元中共享extern- 但是现在,如果在那里进行了所需的声明,则链接到库的应用程序代码可以访问这些全局变量.
那么,是否有一种巧妙的方法可以在多个特定的翻译单元之间共享私有全局变量?
在大型协作项目中使用Eclipse时,我使用"搜索"实用程序在工作区中的文件中查找对象和字符串的出现.只要单击工具栏中的搜索按钮,对话框就会默认为" C/C++搜索"选项卡.但是,99.9%的时间,我需要文件搜索选项卡.
此页面提示如何设置键盘快捷键Ctrl+ H以打开文件搜索选项卡,但我习惯使用鼠标打开该对话框.
有没有办法在" 文件搜索"选项卡中配置" 搜索"按钮?
从昨天对某些问题的回答中,我了解到写入一个联盟成员并从另一个不同类型的成员中读取值是不可移植和不安全的,假设成员的基础对齐.所以在经过一些研究之后,我发现了一个重复这个主张的书面来源并指定了一个流行的例子 - 使用int和float的并集来查找float的二进制表示.
因此,我想知道这个假设是不安全的,我想 - 除了节省记忆(呃......)对工会有什么实际用途?
注意:即,在标准C下.显然,对于特定实现,规则是事先已知的并且可以被利用.
编辑:"不安全"这个词,由于近年来的联想,可能是一个不好的措辞选择,但我认为意图明确.
编辑2:由于这一点在答案中重复 - 节省内存是一个有效的参数.我想知道是否还有其他的东西.
我们有一个嵌入式系统,其中连接了内存映射设备,ARM CPU运行Linux.设备位于地址0x40400000并占用一兆字节(大部分设备不支持实际内存,但地址空间仍然映射到设备).我们目前没有此设备的设备驱动程序.
在器件中,地址处有一个特殊的只读寄存器(称为CID)0x404f0704.该寄存器包含该值CID = 0x404.我试图从ARM上运行的程序中读取该寄存器.
在网上搜索我了解了mmap()可以让我从用户空间访问物理地址的功能.因此,尝试按照我发现的几个例子,我写了以下测试:
#include <sys/mman.h>
#include <fcntl.h>
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
void *pdev = (void *) 0x40400000;
size_t ldev = (1024*1024);
int *pu;
int volatile *pcid;
int volatile cid;
pu = mmap(pdev, ldev, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
if (pu == MAP_FAILED)
errx(1, "mmap failure");
pcid = (int *) (((void *) pu) + 0xf0704);
printf("pu = %08p\n", pu);
printf("pcid = %08p\n", pcid);
cid …Run Code Online (Sandbox Code Playgroud) 另一个C/C++集成问题:我正在尝试libcl.a使用我在C++库中的功能(让我们称之为)更新一些遗留C库(让我们称之为libcppl.a).该liblc.a库正在我的环境中使用,并使用GCC(在C编译器模式下)链接到许多C项目中:
>> gcc prog.c -lcl
Run Code Online (Sandbox Code Playgroud)
在libcl.a目前包括的cl.o对象文件(具有创建gcc从cl.c+ cl.h).
在libcppl.a由的cppl.o对象文件(具有创建g++从cppl.cpp+ cppl.h).
因为现有的应用程序是用C语言编写的,而构建脚本是使用GCC的,所以我希望尽可能简单地过渡到更新的库.因此,我想继续使用GCC作为主编译器,但仍然能够与更新的库链接.
找到这个答案,我可以使用以下方法将C++对象链接到GCC C项目-lstdc++:
>> gcc -c cl.c -o cl.o
>> g++ -c cppl.c -o cppl.o
>> ar rcs libcl.a cl.o cppl.o
>> gcc prog.c -lcl -lstdc++
Run Code Online (Sandbox Code Playgroud)
但是,我想消除 libstdc++ 在编译命令行中明确提到的内容.
我试图做的是在cl库中包含libstdc ++,方法是:
>> ar rcs libcl.a cl.o cppl.o /usr/lib/libstdc++.so.6
Run Code Online (Sandbox Code Playgroud)
但是,在构建应用程序时,我得到:
>> …Run Code Online (Sandbox Code Playgroud) 我正在使用ARM DS-5 v5.20.0包中的Eclipse CDT v4.3.2进行代码开发和Makefile项目调试.
makefile实际上是mkefiles的层次结构,它根据命令行选项在多个配置中创建多个目标.
为了允许有效的静态分析,我使用项目的设置Paths and Symbols来帮助索引器找到各种包含文件并突出显示正确的有条件编译的代码段.
我们的项目包含一个头文件,该文件包含在代码树中的许多模块中.但是,头文件的两个变体存在于两个相邻目录中,用于具有两个构建配置的条件使用:
My_Project
|
+-- Include_1
| |
| +-- header.h
|
+-- Include_2
| |
| +-- header.h
|
+-- Source
| |
| +-- module_1.c
|
+-- makefile
Run Code Online (Sandbox Code Playgroud)
这两种变体大多相似,但包含一些差异.这些头文件包含一些宏定义和一个enumerated typedef.具体而言,以下两个变体的样本部分相同:
// header.h
#define SYMBOL 0x1
typedef enum {
constant = 0x2
} enum_t
Run Code Online (Sandbox Code Playgroud)
典型的代码模块包括这些头中的一个,具体取决于makefile中的配置,并包含对SYMBOL和的引用constant.
在paths and Symbols选项卡中,我只添加My_Project/Include_1到路径列表中,因此索引器不应该混淆.我还在- > - > - > 菜单中禁用了该Allow heuristic …
从 开始master,A分支就分支了。然后,经过几次提交(到master)之后,B分支就被分支了。
的所有者A对文件 进行了更改fname。所有者完全B删除fname。
然后,B被重新定位并合并到master. 现在,A要重新定位并合并。但 nowA的所有者与 file 发生冲突fname,说:
CONFLICT (modify/delete): fname deleted in HEAD and modified in "commit msg". Version "commit msg" of fname left in tree.
git add fname通常,通过编辑中间文件、编辑中间文件,然后编辑git rebase --continue进程来解决冲突。
但是如何解决删除文件的冲突呢?最终结果应该是文件被删除。
c ×5
gcc ×3
eclipse-cdt ×2
attributes ×1
c++ ×1
device ×1
eclipse ×1
g++ ×1
gdb ×1
git ×1
include ×1
indexer ×1
linux ×1
linux-kernel ×1
mmap ×1
optimization ×1
private ×1
rebase ×1
search ×1
unions ×1