相关疑难解决方法(0)

"静态"在C中意味着什么?

static在C代码中看到了不同地方使用的单词; 这就像C#中的静态函数/类(其中实现是跨对象共享的)?

c syntax static

1062
推荐指数
15
解决办法
86万
查看次数

C99中的暂定定义和链接

考虑由两个文件组成的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.cf2.c拒绝链接在一起的平台名称?

注意:这很重要,因为问题出现在静态分析的上下文中.如果这两个文件可能拒绝在某个平台上链接,分析器应该抱怨,但是如果每个编译平台都接受它,那么就没有理由对它进行警告.

c fortran static-analysis compilation c99

32
推荐指数
3
解决办法
5146
查看次数

未命名的命名空间中的全局非静态变量

我找不到关于未命名命名空间中的全局非静态变量的好解释.我尽可能地避免全局变量.在这个特殊情况下,我对纯粹理论方面的行为感兴趣.

假设以下代码:

在啊

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)
  1. 如果我要创建同一个类Widget的两个实例,两个实例是否会共享相同的变量x?

  2. 如果类实例与不同的线程在同一个线程上,那么上述行为是否相同?

  3. 如果变量x是自定义类型而不是内置类型怎么办?

  4. 当变量x将被构造并且被破坏时?

  5. sizeof(Widget)和这些变量之间有任何关系吗?

  6. C++标准中定义了哪些方面,哪些方面没有?

任何其他考虑因素,例如"需要知道"该主题?也许任何人都可以提供好书参考(例如"Effective C++ ..")来阅读更多内容?

c++ namespaces

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

C中的静态函数线程安全吗?

我在C语言中开发文件系统.FUSE是事件驱动系统,因此它将自己的操作码与用户的回调函数相匹配.据我所知,C中的静态函数仅表示范围限制 - 即如果静态函数f()是在foo.c中编写的,则其符号的范围仅为foo.c而不是每个其他源文件.但我的团队成员说静态函数不是线程安全的,所以我们应该使回调非静态.(我们的系统必须在多线程环境中工作,所以它应该考虑并发.)

我整天用Google搜索,但我找不到它.我想问一下你对C中静态函数的线程安全性的认识或看法.

c

2
推荐指数
2
解决办法
1361
查看次数

C中静态全局变量和非静态全局变量的区别

C中“静态全局变量”和“非静态全局变量”有什么区别?

请举例说明它们的不同之处。

(因为,全局静态变量和简单全局变量在整个程序中都保持活动状态,并且可以在任何块中使用。我很困惑如何区分它们。)有人可以用代码解释这一点吗?

c variables scope

2
推荐指数
1
解决办法
4524
查看次数

将c中的变量声明为全局变量或封装它们并使用getter和setter

我已经开始用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)

c encapsulation scope linkage

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