是否有理由将linux代码中设备驱动程序中的大多数函数定义定义为静态?是否有一个原因?
我被告知这是为了确定范围和防止命名空间污染,任何人都可以详细解释为什么在这种情况下使用静态定义?
所以,我正在使用FMOD api,它确实是一个C api.
不是那个坏或什么的.它只是它与C++代码没有良好的接口.
例如,使用
FMOD_Channel_SetCallback( channel, callbackFunc ) ;
Run Code Online (Sandbox Code Playgroud)
它想要一个C风格的函数callbackFunc,但我想传递一个类的成员函数.
我最终使用Win32技巧,使成员函数静态.然后它作为FMOD的回调.
现在我必须破解我的代码以使一些成员静态,只是为了解释FMOD的C-ness.
我想知道它是否可能在FMOD中或者是否有解决方法将回调链接到特定C++对象的实例成员函数(不是静态函数).它会更顺畅.
在C++中,当你在静态成员函数中有局部变量时,它是否意味着那些局部变量也是隐式静态的,还是它们真的是本地的?
例:
static void myClass::somefunc(int someint)
{
int myint = someint; // is myint really a local variable or does it change due to the static qualifier at function level?
}
Run Code Online (Sandbox Code Playgroud)
此外,运行此函数的线程池中的不同线程是否需要通过锁保护myint?假设传递给它的所有值都不同并且彼此没有关系.
编辑:Thanx的答案.现在如果我传入了一个boost::shared_ptr<T>,知道这个对象不会被另一个线程同时使用?(不确定是否可以真正保证,或者你能吗?)
我猜一个原始的ptr传入,如果它被全部使用,需要一些保护吗?
我有一个像Person这样简单的类似于值的类:
class Person
{
public:
Person(ThirdPartyClass *object);
virtual ~Person(void);
virtual std::string GetFullName() const;
virtual int GetAge() const;
virtual int GetNumberOfDaysTillBirthday() const;
};
Run Code Online (Sandbox Code Playgroud)
我正在使用第三方库,ThirdPartyClass需要有一个名为Destroy(第三方库的一部分)的全局/静态函数来调用它来销毁它.Destroy在Person析构函数中调用此函数.
现在我正在尝试对我的Person类进行单元测试,我需要一种模拟/存根Destroy方法的方法.我想我可以围绕静态Destroy函数编写一个包装类,然后使用依赖注入将这个包装器注入到Person类中,但这样做只是为了在这个简单的类上调用这个函数似乎有些过分.什么是简单直接的方法呢?或者依赖注入真的是最好的方法吗?
更新
最终我决定创建一个包含所有第三方库的全局函数的类,然后使用依赖注入将此类传递给我的person类的构造函数.这样我就可以删除Destroy方法.虽然person类只使用单个函数,但是在我的代码中的其他点调用库的其他函数,因为我需要测试那些我将面临同样问题的函数.
我在主应用程序代码中创建了这个包装类的单个实例,并在需要的地方注入它.我选择走这条路是因为我觉得它更清楚.我喜欢Billy ONeal的解决方案,我认为它回答了我的问题,但我意识到如果我要将代码保留几个月并且回来,我会花更长的时间来弄清楚与依赖注入相比发生了什么.我想起了蟒蛇格言的禅语"明确比隐含更好".而且我觉得依赖注入使得发生的事情变得更加明确.
我的gcc版本(5.4)警告未使用的static函数,即使在使用时的头文件中-Wall也是如此.如果定义相同的功能static inline或简单,它不会抱怨inline.
例如,文件中的以下函数unused.h:
static void foo() {}
Run Code Online (Sandbox Code Playgroud)
...当包含在test.cpp文件中时如下:
#include "unused.h"
Run Code Online (Sandbox Code Playgroud)
编译时使用以下命令生成以下编译器诊断-Wall:
In file included from test.cpp:11:0:
unused.h: At global scope:
unused.h:9:13: warning: ‘void foo()’ defined but not used [-Wunused-function]
static void foo() {}
^
Run Code Online (Sandbox Code Playgroud)
据我所知,通常的做法是包含具有许多实用程序功能的标头,在任何给定的源文件中只能使用少数几个.这种行为意味着我得到了我不使用的任何仅声明的函数的警告static.
作为一个实际问题,我可以简单地改变这些以static inline消除警告(或完全关闭特定警告,但我确实发现它不时有用),但似乎大型实用功能不会从中受益内联1更逻辑地声明为static2.
据我所知,在编译翻译单元时,gcc会简单地删除未使用的static函数(就像static inline),因此它们根本不会产生二进制大小或链接时间开销.
我在这里错过了什么吗?是否有充分的理由认为未使用的static功能比问题更多static inline?
1是的,我知道这只是一个暗示,但gcc在很多情况下实际上都是暗示.
2或者更好,只在头文件中声明并在文件中的其他位置定义 …
如果我在我的函数中定义一个函数program.cpp:
constexpr bool isThree(const int number)
{
return number == 3;
}
Run Code Online (Sandbox Code Playgroud)
与声明为静态有什么不同吗?
static constexpr bool isThree(const int number)
{
return number == 3;
}
Run Code Online (Sandbox Code Playgroud)
似乎它们应该是等效的,因为这constexpr意味着函数是内联的,因此不能在编译单元之间共享。
是constexpr全局函数隐含静态的?
SWIG不会包装派生类的继承的静态函数。如何解决?
这是问题的简单说明。
这是一个简单的C ++头文件:
// file test.hpp
#include <iostream>
class B
{
public:
static void stat()
{ std::cerr << "=== calling static function B::stat" << std::endl; }
void nonstat() const
{ std::cerr << "==== calling B::nonstat for some object of B" << std::endl; }
};
class D : public B {};
Run Code Online (Sandbox Code Playgroud)
C ++源文件仅包含头文件:
// file test.cpp
#include "test.hpp"
Run Code Online (Sandbox Code Playgroud)
SWIG接口文件仅包含C ++头文件:
// file test.swig
%module test
%{
#include "test.hpp"
%}
%include "test.hpp"
Run Code Online (Sandbox Code Playgroud)
然后,我以此生成swig包装器代码:
swig -c++ -tcl8 -namespace main.swig
Run Code Online (Sandbox Code Playgroud)
然后我以此创建一个共享库:
g++ -fpic …Run Code Online (Sandbox Code Playgroud) 我有一个相对简单的问题,虽然谷歌上有很多关于它的帖子,但我找不到一个简单地回答这个问题的帖子。
所以简短的问题是“在一个类中混合静态和非静态方法是否可以接受?”。我想我真的在问“坚持使用一种方法是一种好习惯吗”,或者“在使用这两种方法时有什么需要考虑的事情”。
例如,如果我正在建立一个班级来处理我冰箱里的食物,以下哪个(或其他什么)是最好的方法
示例 1:
Class Food
{
public function __construct( $itemName, $itemDescription )
{
.... some code for a new item of food ....
}
public static function getAllFood()
{
.... some code to get all the items in my fridge ....
}
}
$food = new Food( "apple", "Nice juicy Pink Lady apple" );
Food::getAllFood();
Run Code Online (Sandbox Code Playgroud)
或示例 2:
Class Food
{
public function __construct( $itemName, $itemDescription )
{
.... some code for a new item of food ....
} …Run Code Online (Sandbox Code Playgroud) 我尝试$this->但无法为$first_name and $last_name变量赋值.在不删除函数的静态功能且不将静态功能插入变量的情况下,如何回显full_name()?这是代码:
<?php
class User {
public $first_name;
public $last_name;
public function full_name() {
if(isset($this->first_name) && isset($this->last_name)) {
return $this->first_name . " " . $this->last_name;
} else {
return "No name!";
}
}
public static function verify() {
$this->first_name = "firstname";
$this->last_name = "last_name";
}
}
$user = new User();
User::verify();
echo $user->full_name()
?>
Run Code Online (Sandbox Code Playgroud) 我什么时候应该考虑使用在文件范围内定义的静态函数?
当在一个此类函数中完成的任务实际上不属于任何类的成员函数并且仅在某个源文件中(重复)需要此类任务时,我通常使用它们。
我的使用方式是否符合此功能存在的原因?或者我是否劫持了一个原本用于其他用途的概念?