问题标签 [extern]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
6 回答
24518 浏览

c - 在 C 中使用静态函数和变量的原因

我想知道在staticC 中使用关键字作为文件中变量的范围限制。

在我看来,构建 C 程序的标准方法是:

  • 有一堆定义函数和变量的 c 文件,可能范围受限于static.
  • 有一堆 h 文件声明相应 c 文件的函数和可能的变量,供其他 c 文件使用。私有函数和变量不在 h 文件中发布。
  • 每个 c 文件都单独编译成一个 o 文件。
  • 所有 o 文件都链接到一个应用程序文件。

static如果变量没有在 h 文件中发布,我看到将 gobal 声明为的两个原因:

  • 一是为了可读性。通知包括我自己在内的未来读者,在任何其他文件中都没有访问变量。
  • 第二个是防止另一个 c 文件将变量重新声明为extern. 我想链接器不喜欢既是externand的变量static。(我不喜欢文件将其他人拥有的变量重新声明为的想法,extern这可以练习吗?)

还有什么原因吗?

函数也是如此static。如果原型没有在 h 文件中发布,其他文件可能无论如何都不会使用该功能,那为什么要定义它static呢?我可以看到相同的两个原因,但仅此而已。

0 投票
2 回答
285 浏览

c++ - 在 C++ 中实现 C#“只读”行为

这是我关于堆栈溢出的第一个问题,所以要温柔。

让我首先解释一下我希望看到的确切行为。如果您熟悉 C#,那么您就会知道将变量声明为“只读”允许程序员只为该变量赋值一次。进一步尝试修改变量将导致错误。

我所追求的:我想确保我定义的任何和所有单例类都可以在我的程序中准确地实例化一次(更多细节在底部)。

我实现目标的方法是使用 extern 来声明对单例的全局引用(稍后我将在我选择的时间实例化它。我看起来像这样,

然而,这并没有真正起作用,我不知道从这里去哪里。

关于我所反对的一些细节:

我担心线程,因为我正在编写将处理游戏逻辑的代码,同时与几个第三方进程和我将创建的其他进程进行通信。最终,我将不得不实现某种同步,以便多个线程可以毫无顾虑地访问 Singleton 类中的信息。因为我不知道我可能喜欢做什么样的优化,或者线程究竟需要什么(从未使用它做过真正的项目),我认为能够在实例化单例时可预测地控制将是一件好事。

想象一下,如果流程 A 创建流程 B,其中 B 包含多个针对多个文件和/或库分布的单例。如果我不能可靠地确保这些单例对象被实例化的顺序(因为它们可能相互依赖,并且在 NULL 对象上调用方法通常是一件坏事),那可能是一场真正的噩梦。

如果我在 C# 中,我只会使用 readonly 关键字,但是有什么方法可以在 C++ 中实现这个(编译器支持的)行为?这甚至是个好主意吗?感谢您的任何反馈。


编辑

如果我被锁定在上面的代码示例中,选择的答案将是做我需要的最简单的方法。尽管我只打算制作这些 EntryPoint 对象之一,但我还是决定将模式从单例中改变。

我认为我需要所有这些单例的原因之一是我计划创建一个更大的架构来支持模块化插件类型的应用程序。我还想要更多的错误检查和内存保护,以尽量减少内存泄漏。我很高兴地发现跨平台的 Qt ( http://qt.nokia.com/ ) 提供了保护指针和其他很酷的特性。

0 投票
1 回答
81 浏览

c++ - 有人能弄清楚这有什么问题吗?我收到链接错误

0 投票
4 回答
6778 浏览

c++ - extern "C" DLL:调试正常,Release 抛出错误 C2059

我有一个作为 C++ Win32 应用程序创建的 DLL。为了防止在我的 DLL 中出现名称错误,我使用了下面定义的 EXPORT 定义:

要编译此代码,我必须进入项目的属性并将 C/C++ 设置Calling Convention__stdcall (/Gz)并设置Compile AsCompile as C++ Code (/TP)

这在调试模式下工作,但发布模式正在引发error C2059: syntax error: 'string'我所有的导出功能 - 即使我已将发布模式设置配置为与调试设置相同。

如何获得发布模式进行编译?

问候,
~Joe
(在 Visual Studio 2008 Professional 下开发)

编辑:
很多关于我的#define 的评论,这似乎没有引起任何问题。

为了消除混淆,我的头文件已被重写如下:

这就是全部。

错误是:
描述 error C2059: syntax error: 'string'
文件 coilmodel.h
4

同样,此错误仅出现在发布模式,而不是调试模式。
项目是一个 C++ Win32 DLL 应用程序。

0 投票
2 回答
3479 浏览

c - 静态库中的外部变量,使用 Objective-C

我已经建立了一个静态库,可以链接到我的 iPhone 应用程序中。这个库使用了一些全局变量和函数,就像在 C 中一样。我的问题是,当使用例如:

当我在代码中的任何位置使用此函数或访问这些变量时,编译器会告诉我

"_do_stuff" 引用自:tests.o 中的-[Object testMethod]

"_a_variable" 引用自:tests.o 中的-[Object testMethod]

"_an_array" 引用自:tests.o 中的 -[Object testMethod]

Symbol(s) not found Collect2: Id returned 1 exit status

有没有人遇到过这个问题?我知道我在做一些愚蠢的事情,我错过了一些关键的 Objective-C 或 C 概念,但我真的看不出是什么。所以我希望有人能帮助我。提前致谢。

0 投票
1 回答
1844 浏览

c - 链接时间“未定义的引用”错误

我很难编写makefile。我有使用extern变量的经验,当我在不使用 makefile 的情况下构建项目时,我绝对没有错误,我可以运行程序。但是从我编写生成文件来构建项目的那一刻起,我就遇到了undefined reference to错误。

我有超过 3 个文件,但为简单起见,我将在此处使用 3 个文件来解释设置。

使用 makefile 时,我undefined reference to在指向 File1.c 和 File2.c 的链接时间出现错误?

我是否犯了 Eclipse 自行修复的任何错误(当不使用 makefile 时)以及当我使用 makefile 时会出现哪些错误?

我的最终生成文件看起来像这样 -

OBJ1 = 算法/main.o 算法/File1.o 算法/File2.o

0 投票
2 回答
1074 浏览

c - 有没有办法让函数对库和包含/链接库的人来说是全局的?

我现在有点困惑。我认为当您在函数上使用 extern 时,它会对所有内容都变得全局,但似乎并非如此......我现在想要的是有一些我可以在我的静态库中使用的函数集和在链接它的程序中。我该怎么做?我正在使用 Objective-C

0 投票
3 回答
1506 浏览

c++ - 为什么在全局或外部声明结构时会出现段错误?

我在标题中定义了一个结构,如下所示:

我在我的代码中这样使用:

这样可行。但是,如果我LC_ERRMSG err;在全局声明 - 即在它使用的函数之外,甚至extern LC_ERRMSG err;(这是我的初衷,因为我希望能够在中心位置读出错误状态),则 snprintf 调用中的代码段错误.

你能给我任何线索为什么吗?

ddd 告诉我,内存在全局声明时被初始化为全零,或者在声明为 extern 时至少被初始化和可读。值 szFilename、szError 和 LC_ERR_LEN 都是正确且有意义的。

0 投票
1 回答
1689 浏览

iphone - iPhone,检查是否存在常量

如何检查是否在运行时设置了常量?例如,在 iOS 4 中,UIApplicationDidEnterBackgroundNotification 是可用的,但在 iOS 3 上运行时,如果您尝试使用它会报错。

0 投票
1 回答
1976 浏览

compiler-construction - LLVM 外部函数

我最近开始在 MinGW 下试验 LLVM。我已阅读Kaleidoscope教程,但现在我遇到了外部功能问题。

我正在声明这样的外部函数:

其中 mod 是 Module* 而 ctx 是 LLVMContext&。

在这种情况下,一切正常。但是,如果我声明一个函数:

并将 SinFunction 声明从使用“sin”更改为使用“my_cubic_transform”(不更改任何其他内容),然后我得到:

更改我的 makefile 以包含“-g”选项无效。Kaleidoscope 教程建议这在 LLVM 中是可能的(至少对于我正在使用的 JIT)。那我做错了吗?如果是这样,是什么?