在C中,编译器将按照声明它们的顺序布置结构的成员,在成员之间插入可能的填充字节,或者在最后一个成员之后插入,以确保每个成员正确对齐.
gcc提供了一种语言扩展,__attribute__((packed))它告诉编译器不要插入填充,允许结构成员不对齐.例如,如果系统通常要求所有int对象都具有4字节对齐,则__attribute__((packed))可能导致int在奇数偏移处分配struct成员.
引用gcc文档:
`packed'属性指定变量或结构字段应该具有尽可能小的对齐 - 变量的一个字节和字段的一个位,除非您使用`aligned'属性指定更大的值.
显然,使用此扩展可以导致更小的数据要求但代码更慢,因为编译器必须(在某些平台上)生成代码,以便一次一个字节地访问未对齐的成员.
但有任何不安全的情况吗?编译器是否始终生成正确(但速度较慢)的代码来访问打包结构的未对齐成员?在所有情况下都可以这样做吗?
我理解const正确性意味着什么,而我的问题不在于const正确性是什么.所以我不期待一个解释或C++ - FAQ链接.
我的问题是:
constC和constC++ 之间的语义差异是什么?和从各自的标准中得出差异的报价将是很好的.
我经常在C和C++之间切换,我想知道在这样做时应该记住的重点.
我似乎不记得这些的原因(特别感谢你能提供一个推理)但是从我的头脑中,我记得:
char const*C++中的,但在C中它可以是char*.我错过了什么?
我经常在Unix(AIX/KSH)中使用这个list命令:
ls -Artl
它显示如下文件:
-rw-r--r-- 1 myuser mygroup 0 Apr 2 11:59 test1.txt
-rw-r--r-- 1 myuser mygroup 0 Apr 2 11:59 test2.txt
我想修改命令,以便显示文件的完整路径.例如:
-rw-r--r-- 1 myuser mygroup 0 Apr 2 11:59 /usr/test1.txt
-rw-r--r-- 1 myuser mygroup 0 Apr 2 11:59 /usr/test2.txt
有任何想法吗?
我找到了几种解决方法使用pwd或者find- 据我所知 - 如果我想保留ls选项,这不起作用.
在了解了LLVM如何工作之后,我对如何生成可移植的低级代码以及如何构建这个"东西"模块感到非常兴奋.
但我今天发现C--的存在似乎与LLVM共享一些概念.
所以我正在寻找一些信息,帮助我理解这两个项目之间的主要区别......以及为什么两者都存在.
对我来说,LLVM看起来有点像瑞士军刀用于编译器基础设施,而C--看起来远不如先进.
该diff程序以其各种形式,相当擅长计算两个文本文件之间的差异,并且比完整地显示两个文件更紧凑地表达它.它将差异显示为插入和删除的行块的序列(或在某些情况下更改的行,但这相当于删除后插入).patch源控制系统使用相同或非常类似的程序或算法来最小化表示同一文件的两个版本之间的差异所需的存储.这里和这里讨论算法.
但是当文件块在文件中移动时,它会掉下来.
假设您有以下两个文件,a.txt并且b.txt(假设它们都是数百行而不是6行):
a.txt b.txt
----- -----
1 4
2 5
3 6
4 1
5 2
6 3
Run Code Online (Sandbox Code Playgroud)
diff a.txt b.txt 显示这个:
$ diff a.txt b.txt
1,3d0
< 1
< 2
< 3
6a4,6
> 1
> 2
> 3
Run Code Online (Sandbox Code Playgroud)
从a.txtto 更改b.txt可以表示为"取前三行并将它们移动到最后",但是diff显示移动的行块的完整内容两次,错过了非常简短地描述这个大变化的机会.
请注意,diff -e仅显示一次文本块,但这是因为它不显示已删除行的内容.
是否存在diff算法的变体(a)保留diff表示插入和删除的能力,以及(b)有效地表示移动的文本块而不必显示其全部内容?
文档没有说buildvs vs install做什么
我的期望是它就像make install; 即它需要编译的东西并放入它的最终位置(/usr/local/bin/my_new_toy或其他任何东西),但似乎它放入了东西GOROOT/bin
我可以告诉你做一个make install- 即把东西放在别的地方吗?或者我只是写一个makefile(请告诉我没有)?
背景:
在最高版本为9的Mac OS版本中,文本文件的标准表示使用ASCII CR(回车)字符,值十进制13,以标记行的结尾.
与早期版本不同,Mac OS 10与UNIX类似,并使用ASCII LF(换行符)值十进制值10来标记一行的结尾.
问题是,什么是字符常量的值'\n',并'\r'在C和C++编译器Mac OS发布OS X之前?
可以采用(至少)两种可能的方法:
'\n'作为ASCII字符LF,并将其转换为与从CR上输出,并从文本流输入(类似于LF和CR-LF在Windows系统之间的转换); 要么'\n'作为ASCII CR字符,这需要对输入或输出的任何转换.第二种方法会有一些潜在的问题.一个是假设'\n'LF的代码可能会失败.(无论如何,这样的代码本质上是不可移植的.)另一个是仍然需要一个不同的值'\r',并且在基于ASCII的系统上,CR是唯一合理的值.并且C标准不允许'\n' == '\r'(感谢mafso找到引文,5.2.2第3段),因此必须使用其他一些值'\r'.
在Mac OS N下编译和执行时,此C程序的输出是多少,N小于10?
#include <stdio.h>
int main(void) {
printf("'\\n' = %d\n", '\n');
printf("'\\r' = %d\n", '\r');
if ('\n' == '\r') {
printf("Hmm, this could be a problem\n");
}
}
Run Code Online (Sandbox Code Playgroud)
这个问题适用于C和C++.我认为两者的答案都是一样的.
答案也可能因C编译器而异 - 但我希望编译器实现者能够保持彼此的一致性.
为了清楚起见,我不是要问Mac OS的旧版本用于表示文本文件中的行尾.我的问题只是关于常量的值'\n'和'\r' …
在我自己的一些旧代码中,我使用以下代码:
Object.prototype.instanceOf = function( iface )
{
return iface.prototype.isPrototypeOf( this );
};
Run Code Online (Sandbox Code Playgroud)
然后我做(例如)
[].instanceOf( Array )
Run Code Online (Sandbox Code Playgroud)
这有效,但似乎以下情况也是如此:
[] instanceof Array
Run Code Online (Sandbox Code Playgroud)
现在,这肯定只是一个非常简单的例子.因此,我的问题是:
是否a instanceof b 总是一样的b.prototype.isPrototypeOf(a)?
有PRIu128,其行为类似于PRIu64来自<inttypes.h>:
printf("%" PRIu64 "\n", some_uint64_value);
Run Code Online (Sandbox Code Playgroud)
或者手动逐位转换:
int print_uint128(uint128_t n) {
if (n == 0) return printf("0\n");
char str[40] = {0}; // log10(1 << 128) + '\0'
char *s = str + sizeof(str) - 1; // start at the end
while (n != 0) {
if (s == str) return -1; // never happens
*--s = "0123456789"[n % 10]; // save last digit
n /= 10; // drop it
}
return printf("%s\n", s);
}
Run Code Online (Sandbox Code Playgroud)
是唯一的选择吗? …
c ×6
c++ ×3
gcc ×2
algorithm ×1
assert ×1
command-line ×1
const ×1
diff ×1
go ×1
inheritance ×1
instanceof ×1
javascript ×1
llvm ×1
ls ×1
mac-classic ×1
pragma-pack ×1
prototype ×1
shell ×1
unix ×1