问题标签 [static-functions]

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 投票
1 回答
72 浏览

c++ - 在 c++ 中使用静态函数,我的教授希望我告诉 main 哪个对象具有最高优先级而不传递任何内容

我得到了以下主要功能,我必须对要传递的对象进行编码。

这里主要:

我很困惑ToDo::highestPriority()->getTask()ToDo::highestPriority()->output(": ")我不知道如何使用它们来告诉 main 数组中的哪个位置具有最高优先级。

我的跑步理论是使用 3 个 staticint如下:

  • 跟踪对象的数量(计数器)
  • 跟踪哪个对象具有最高优先级(通过使其与最高优先级的计数器相等),以及
  • 跟踪最高优先级的数字。

我仍然无法弄清楚如何告诉 main 数组中的哪个位置具有最高优先级。

我无法编辑主要功能,只能创建一个对象,有人可以帮我解决这个问题吗?

0 投票
2 回答
6899 浏览

c++ - gcc 警告未使用的静态函数,但不是静态内联:有实际区别吗?

我的 gcc 版本(5.4)警告未使用的static函数,即使在-Wall使用时在头文件中也是如此。static inline如果定义或简单地定义了相同的功能,它不会抱怨inline

例如,文件中的以下函数unused.h

...当包含在test.cpp文件中时,如下所示:

编译器使用 时生成以下编译器诊断-Wall

据我所知,通常的做法是包含具有许多实用功能的标头,其中只有少数可能用于任何给定的源文件。这种行为意味着我会收到关于我不使用的任何仅声明的函数的警告static

作为一个实际问题,我可以简单地更改这些以static inline消除警告(或完全关闭特定警告,但我确实发现它有时很有用),但似乎大型实用程序功能不会从中受益内联1更符合逻辑地声明static2

据我所知,在编译翻译单元时,gcc 会简单地删除未使用的static函数(就像static inline),因此它们根本不会造成二进制大小或链接时间开销。

我在这里错过了什么吗?是否有充分的理由认为未使用static的功能比 更成问题static inline


1是的,我知道这只是一个提示,但 gcc 实际上在许多情况下都会提示。

2或者可能更好,只在头文件中声明并在文件中的其他位置定义.cpp- 但这会禁止仅使用头文件,这有时很方便。

0 投票
1 回答
670 浏览

c - 为什么会出现这个错误?“函数的静态声明遵循非静态声明”?

我正在学习静态函数,并且根据规则,如果我将函数声明为静态函数,那么我无法将此函数访问到其他 c 文件中,如果我尝试访问,那么应该有一个错误“未定义对 `fun 的引用”所以我在 add.c 和 add.h 文件中声明并定义静态函数并将该函数调用到 main.c 文件中,但我得到不同的错误,即“ 'fun' 的静态声明遵循非静态声明强文本 ,所以我的问题是那为什么这个错误来了????请原谅我英语不好!!!!

0 投票
1 回答
470 浏览

c++ - 尝试在 C++ 中的静态函数内使用构造函数创建对象

我试图使用构造函数在静态函数中创建一个对象。这是代码

我知道使用 new 是最好的方法,但我试图使用 contructor 来知道它是否可以完成。

输出是:

构造函数调用... 009AF874

析构函数调用... 009AF874

a = 10

a = 100

现在这是我的问题,

1) 为什么在没有使用像 A obj 这样的声明创建对象时调用析构函数;

2)如果调用了析构函数,那么我如何能够为 otr.a 赋值;

通过查看程序的输出,我得出以下结论。

1)我在某处读到,在将内存分配给对象后调用了构造函数。如果创建了一个对象,那么它必须被销毁,并且 obj 的范围决定现在销毁它。

2)由于对象地址在销毁它之前具有先前的值并返回调用返回存储它的变量的地址。当我尝试访问它时,我能够这样做,因为该内存地址仍然存在。

0 投票
1 回答
2087 浏览

objective-c - 如何在objective-c文件中调用带有转义闭包的swift静态方法

我有这个用swift编写的静态函数,我需要在objective-c文件中调用

迅速我会简单地称之为

我应该如何在objective-c文件中调用它?

编辑:我想它应该看起来像这样?

0 投票
3 回答
91 浏览

c++ - 是否将参数加载到空函数的缓存中?

我知道 C++ 编译器会优化空(静态)函数。

基于这些知识,我编写了一段代码,只要我定义了一些标识符(使用-D编译器的选项),它就应该得到优化。考虑以下虚拟示例:

期望的行为如下:无论何时NO_INC定义标识符(-DNO_INC在编译时使用),所有调用都T::inc(...)应该被优化掉(由于空函数体)。否则,调用T::inc(...)应该触发某个给定值的增量i

我对此有两个问题:

  1. 我的假设是否正确,即T::inc(...)在我指定选项时调用不会对性能产生负面影响,-DNO_INC因为对空函数的调用已优化?
  2. 我想知道变量 (ai) 在被调用时是否仍然加载到缓存T::inc(a, i) 中(假设它们还没有),尽管函数体是空的。

感谢您的任何建议!

0 投票
3 回答
1051 浏览

c++ - 为什么我不能像这样在静态成员函数中调用静态成员变量?

每个人!有如下代码片段: testcase.cpp

当我单击“构建”按钮时,输出消息是

错误 LNK2001:无法解析的外部符号“public:static int Test::b”(?b@Test@@2HA) 1>B:\PROGRAMPROJECT\visual 2015 pro\testcase\testcase\x64\Debug\testcase.exe:致命错误LNK1120:1 个未解决的外部因素

但是,当我像这样更改代码位置时:

它确实有效!我不知道为什么?有人可以帮助我吗?我的IDE是vs pro 2015 + windows10。

0 投票
2 回答
405 浏览

c++ - 如何在不包含任何文件的情况下从另一个翻译单元访问该功能?

我正在阅读有关静态函数的内容,据说如果该函数是静态的,那么您只能在同一个文件中使用它。测试后,我意识到这不是真的,因为如果你在文件中包含一个静态函数,你仍然可以在另一个文件中使用该函数。然后我读到了一个说明,你实际上只能在同一个翻译单元中使用静态函数。好的,这是有道理的,因为它意味着 .cpp + 包含,但是即使该函数不是静态的,除非包含该文件,否则您仍然无法使用它。那么,如何在不包含任何内容的情况下首先从另一个翻译单元访问一个函数,静态函数有什么意义呢?

主文件

静态文件.h

这编译好了。如果我将该函数设为非静态并删除 #include "Staticf.h" 我将无法在 Main 中使用它。那么,如果您也不能访问非静态函数,为什么还需要静态函数呢?

0 投票
1 回答
69 浏览

c - 将程序构建为库时处理静态函数

为了对我的一个程序实施单元测试,我添加了一个 makefile 规则,以便在运行“make check”时将程序构建为静态库。我用#ifndef TEST_LIB#endif包装 main() (TEST_LIB在构建为库时定义)。

然后我创建了一些小的 C 文件来测试该库中的一些函数。

库中的一些函数是静态声明的。

当我尝试编译测试时,您可能会猜到会产生如下警告:

/../test/config_test.c:15:3:警告:函数“realize_home”的隐式声明 [-Wimplicit-function-declaration]

因为realize_home是在程序的源代码(一个.c 文件)中静态声明的。

我尝试的一种解决方案是将#include config_rmw.c(包含静态函数)添加到.c 单元文件(config_test)中。这实际上有效并且在我编译时不会给我任何警告,即使 config_rmw.c 已经内置到库中。

我想到的另一个解决方案是

并将原型添加到标题中,即#ifdef 语句。

但是这样做感觉不太对,尤其是当我继续实施更多单元测试时,必须为更多功能完成它时。

我最近在一本书中读到静态函数应该放在头文件中。我试过了,但它只是部分地解决了我的问题。我结束了编译器警告,例如:

在 ../../src/rmw.c:38:0: ../../src/config_rmw.h:86:1 中包含的文件中:警告:“realize_home”已定义但未使用 [-Wunused-function ] implementation_home (char **str) ^~~~~~~~~~~~

我做了一些阅读,我有点理解为什么会发生这种情况。基本上这意味着我会在每个 .c 文件中获得该函数的单独副本,其中 #includes 定义了它的头文件。我不需要。我静态声明一些函数的原因是因为它们只需要在一个文件中。

然后我读了一些评论,人们说静态函数永远不应该在头文件中定义!

所以......我一直想知道最好的方法和其他选择。我更喜欢让我的程序井井有条,并练习良好的编码技能。

我只使用基于脚本的方法编写了一些测试,这不需要将我的程序构建为库,但我认为使用这两种方法会有优势,具体取决于正在测试的函数。

更新(添加)该程序有 20 个源文件(包括标题)和约 4K 行代码。

0 投票
1 回答
75 浏览

templates - 如果语句未能评估条件

我有一个包含两个枚举器的基本类,一个用于输入,一个用于输出。它有两个成员函数,它们都是静态的。第一个函数只是一个静态函数,它根据输入返回一个值。它将调用第二个函数,该函数是一个将返回 constexpr 值的 constexpr 函数模板。你可以在这里看到完整的课程。

如果我在编译时知道值时使用函数模板本身:

我得到正确的输出:

-输出-


但是,当我在运行时确定值时尝试使用非 constexpr 成员函数时,由于某种原因,非 constexpr 函数无法执行 if 语句中的代码。

无论我从键盘输入什么值012,它都无法在Foo::update()'sif 语句中执行代码。它总是打印出123.

如果有帮助;我正在使用Visual Studio 2017 CE v15.9.4并且正在编译它,语言设置为ISO C++ Latest Draft Standard (/std:c++latest).

我不知道为什么这段代码无法评估if statements为真并在其范围内调用代码。