小编hrn*_*rnt的帖子

为什么编译器允许字符串文字不是const?

内存中的文字究竟在哪里?(见下面的例子)

我不能修改文字,所以它应该是一个const char*,虽然编译器允许我使用char*,即使有大多数编译器标志也没有警告.

虽然const char*类型的隐式转换为char*类型给了我一个警告,见下文(在GCC上测试,但它在VC++ 2010上的行为类似).

另外,如果我修改一个const char的值(下面有一个技巧,GCC会更好地给我一个警告),它没有给出任何错误,我甚至可以修改并在GCC上显示它(尽管我猜它仍然是未定义的行为,我想知道为什么它没有对文字做同样的事情).这就是为什么我问这些文字存储在哪里,以及哪些更常见的const应该存储?

const char* a = "test";
char* b = a; /* warning: initialization discards qualifiers 
  from pointer target type (on gcc), error on VC++2k10 */

char *c = "test"; // no compile errors
c[0] = 'p'; /* bus error when execution (we are not supposed to 
  modify const anyway, so why can I and with no errors? And where is the 
  literal stored for I have a "bus error"? 
  I have 'access …
Run Code Online (Sandbox Code Playgroud)

c c++ memory standards

9
推荐指数
1
解决办法
2421
查看次数

VC++中的"复制到输出目录"

使用VS2008进行C#时,有一个文件属性"复制到输出目录".VC++中似乎缺少此属性.逼近相同效果的最简单方法是什么?

我被告知应该使用自定义构建规则.这是否真的是最简单的方法,如果是,那么应该如何实现自定义构建规则?

visual-studio-2008 visual-c++

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

如果Objective C是C的严格超集,那为什么不编译呢?

考虑以下源文件,该文件(至少应该是)有效C.

void id() {
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试编译它gcc -c test.m,但我收到以下错误:

test.m:1: error: ‘id’ redeclared as different kind of symbol
<built-in>:0: error: previous declaration of ‘id’ was here 
Run Code Online (Sandbox Code Playgroud)

如果Obj-C是一个严格的超集,那么这不是说所有有效的C程序也是有效的Obj-C程序吗?请注意,我没有#import任何东西,我也没有链接.

当然,也许LLVM(1)在默认情况下做了一些神奇的事情,或者这可能是一个错误.

(1):i686-apple-darwin11-llvm-gcc-4.2(GCC)4.2.1(基于Apple Inc. build 5658)(LLVM build 2336.1.00)

编辑:让我澄清一下这个问题 - 问题不在于id部分,我知道它具有特殊意义.我的观点是,人们普遍认为Obj-C是C的严格超集.但是,如果它的关键字与有效的C程序冲突,则情况并非如此.

因此编译器不保留任何一个id,或者Obj-C不是严格的超集.问题的关键在于询问是哪种情况,或者是否存在我遗漏的明显事实.

objective-c

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