考虑由两个文件组成的C程序,
在f1.c:
int x;
Run Code Online (Sandbox Code Playgroud)
f2.c:
int x=2;
Run Code Online (Sandbox Code Playgroud)
我对C99标准第6.9.2段的解读是该程序应该被拒绝.在我对6.9.2的解释中,变量x是暂定的f1.c,但是这个暂定的定义在翻译单元的末尾变成了一个实际的定义,并且(在我看来),应该表现得好像f1.c包含了定义int x=0;.
对于所有编译器(以及重要的是,链接器)我能够尝试,这不是发生的事情.我试过的所有编译平台都链接了上面两个文件,两个文件中的值x都是2.
我怀疑这是偶然发生的,或者只是作为标准要求提供的"简单"功能.如果你考虑一下,这意味着链接器中对那些没有初始化器的全局变量有特殊支持,而不是那些显式初始化为零的全局变量.有人告诉我,无论如何编译Fortran可能都需要链接器功能.那将是一个合理的解释.
有什么想法吗?对标准的其他解释?文件f1.c和f2.c拒绝链接在一起的平台名称?
注意:这很重要,因为问题出现在静态分析的上下文中.如果这两个文件可能拒绝在某个平台上链接,分析器应该抱怨,但是如果每个编译平台都接受它,那么就没有理由对它进行警告.
我找不到关于未命名命名空间中的全局非静态变量的好解释.我尽可能地避免全局变量.在这个特殊情况下,我对纯粹理论方面的行为感兴趣.
假设以下代码:
在啊
namespace ai {
class Widget {
void DoSomething(int param);
};
}
Run Code Online (Sandbox Code Playgroud)
在a.cc
namespace {
int x;
void Helper() {
}
}
namespace ai {
void Widget::DoSomething(int param) {
x = param;
Helper();
}
}
Run Code Online (Sandbox Code Playgroud)
如果我要创建同一个类Widget的两个实例,两个实例是否会共享相同的变量x?
如果类实例与不同的线程在同一个线程上,那么上述行为是否相同?
如果变量x是自定义类型而不是内置类型怎么办?
当变量x将被构造并且被破坏时?
sizeof(Widget)和这些变量之间有任何关系吗?
C++标准中定义了哪些方面,哪些方面没有?
任何其他考虑因素,例如"需要知道"该主题?也许任何人都可以提供好书参考(例如"Effective C++ ..")来阅读更多内容?
我在C语言中开发文件系统.FUSE是事件驱动系统,因此它将自己的操作码与用户的回调函数相匹配.据我所知,C中的静态函数仅表示范围限制 - 即如果静态函数f()是在foo.c中编写的,则其符号的范围仅为foo.c而不是每个其他源文件.但我的团队成员说静态函数不是线程安全的,所以我们应该使回调非静态.(我们的系统必须在多线程环境中工作,所以它应该考虑并发.)
我整天用Google搜索,但我找不到它.我想问一下你对C中静态函数的线程安全性的认识或看法.
C中“静态全局变量”和“非静态全局变量”有什么区别?
请举例说明它们的不同之处。
(因为,全局静态变量和简单全局变量在整个程序中都保持活动状态,并且可以在任何块中使用。我很困惑如何区分它们。)有人可以用代码解释这一点吗?
我已经开始用C编程了,总的来说我正在寻找构建代码的"最佳实践".
之前主要使用面向对象的语言,我开始采用这些语言的一些实践.
我的具体问题是:这段代码被认为是"可接受的"C代码,还是我遇到了试图在C中使用封装的人遇到的常见陷阱?
// A.h
void setValue(int);
int getValue();
// A.c
#include "A.h"
int my_private_value;
void setValue(int v)
{
my_private_value = v;
}
int getValue(void)
{
return my_private_value;
}
Run Code Online (Sandbox Code Playgroud)