有人可以解释为什么这个底层代码正在为初始化寻找常量值吗?在函数中做同样的事情不会造成任何麻烦(即使另一个变量 - 在这种情况下是b - 是常量)。
socket.on( 'message', function( data ) {
console.log("saw a request to the socket");
var actualContent = $( "#messages" ).html();
var newMsgContent = '<li> NAME: ' + data.name + ' = ID: ' + data.id + ' = AVATAR: ' + data.avatar + ' = MESSAGE: ' + data.message + '</li>';
var content = newMsgContent + actualContent;
content = $(content).slice(0, 25).map(function(i, x) { return x.outerHTML }).toArray().join(''); // Will return first 25 messages
$( "#messages" ).html( content );
});
刚刚问过一个类似的问题(不知道怎么做),但答案只是因为语言的设计规范是这样说的(这没有帮助) - 任何人都可以用这种方式解释它所服务的目的?
答案 0 :(得分:3)
您显示的a
和b
对象具有静态存储持续时间,这意味着它们在整个程序执行期间存在。 2011版C标准(草案N1570),第6.7.9节,第4段,说“具有静态或线程存储持续时间的对象的初始值设定项中的所有表达式应为常量表达式或字符串文字。”
C没有任何计算静态对象初始值的规定。它们的值需要在编译时确定,或者是可重定位地址,可以由链接器或加载器计算。可重定位地址计算为简单表达式,它们是程序各部分加载到内存中的函数。
在没有extern
或static
的函数内部(在技术上,内部块,在函数定义内)声明的对象具有自动存储持续时间。 C标准允许使用在运行时计算的表达式初始化它们。编译器实现这一点相对容易,因为它们只是放置代码来计算函数开头的值。
从理论上讲,C标准可以允许您使用在运行时计算的值初始化静态对象,并且实现可以通过包含在main
之前执行的代码来实现此目的。其他编程语言具有这样的功能。但是,它引入了并发症。例如,如果您在一个源文件中编写extern int b; int a = 3*b;
而在另一个源文件中编写extern int a; int b = a+4;
,那么应首先执行哪一个?你怎么写语言规则来禁止这个?对于这个问题和其他问题可能有解决方案,但C语言开发还很年轻时开始,它避免了这样的并发症。