我正在尝试用内联函数替换一些宏子程序,因此编译器可以优化它们,因此调试器可以进入它们,等等.如果我将它们定义为普通函数,它可以工作:
void do_something(void)
{
blah;
}
void main(void)
{
do_something();
}
Run Code Online (Sandbox Code Playgroud)
但如果我将它们定义为内联:
inline void do_something(void)
{
blah;
}
void main(void)
{
do_something();
}
Run Code Online (Sandbox Code Playgroud)
它说"错误:未定义的外部".那是什么意思?在黑暗中刺了一下,我试过了
static inline void do_something(void)
{
blah;
}
void main(void)
{
do_something();
}
Run Code Online (Sandbox Code Playgroud)
没有更多的错误.函数定义和对函数的调用都在同一个.c文件中.
有人可以解释为什么一个有效,另一个没有?
(第二个相关问题:如果我想在多个.c文件中使用它们,我在哪里放入内联函数?)
我对内联函数有疑问.内联函数不会涉及任何函数调用,只需在对内联函数进行调用时替换函数定义.内联函数具有类型强制,与宏不同.如果递归函数是内联的,会发生什么?
我们都知道内联函数可以使调试变得更加棘手,因为它们可以从堆栈跟踪等中省略.但是假设我想从gdb中调用内联函数,并且我知道它的名称及其参数.我想我应该能够做到这一点,但我得到了这个:
Cannot evaluate function -- may be inlined
Run Code Online (Sandbox Code Playgroud)
我曾经nm在我正在使用的共享库中列出符号,并发现我想调用的函数不在那里.没什么大惊喜.我想要的是一种生成这些内联函数的可见定义的方法.我可以访问当前包含内联定义的头文件,但我无法真正修改这些头文件.也许有一些方法可以告诉编译器发出它在翻译单元中看到的所有内联函数的定义?或者其他一些技巧可以让你更容易调用和检查gdb中的内联函数的结果?
我在Linux上使用GCC 4.7.2和GDB 7.5.1.而且我无法真正切换到非优化版本,因为我正在从生产中调试核心转储(在开发中我只是关闭优化,然后事情变得更容易).
这段代码会导致未定义的行为吗?
header.h
#ifdef __cplusplus
extern "C"
{
#endif
inline int foo(int a)
{
return a * 2;
}
#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)
def.c
#include "header.h"
extern inline int foo(int a);
Run Code Online (Sandbox Code Playgroud)
use.c
#include "header.h"
int bar(int a)
{
return foo(a + 3);
}
Run Code Online (Sandbox Code Playgroud)
main.cpp
#include <stdio.h>
#include "header.h"
extern "C"
{
int bar(int a);
}
int main(int argc, char** argv)
{
printf("%d\n", foo(argc));
printf("%d\n", bar(argc));
}
Run Code Online (Sandbox Code Playgroud)
这是一个程序的例子,其中一个inline函数必须在C和C++中使用.如果def.c被删除并且foo没有在C中使用它会起作用吗?(这假设C编译器是C99.)
编译时,此代码有效:
gcc -std=c99 -pedantic -Wall -Wextra -c -o …Run Code Online (Sandbox Code Playgroud) 我正在制作一个向量/矩阵库。(GCC、ARM NEON、iPhone)
typedef struct{ float v[4]; } Vector;
typedef struct{ Vector v[4]; } Matrix;
Run Code Online (Sandbox Code Playgroud)
我将结构数据作为指针传递,以避免调用函数时数据复制导致性能下降。所以我一开始设计的功能是这样的:
void makeTranslation(const Vector* factor, Matrix* restrict result);
Run Code Online (Sandbox Code Playgroud)
但是,如果函数是内联的,是否有任何理由将值作为指针传递以提高性能?这些变量也被复制了吗?寄存器和缓存怎么样?我尝试重新设计这样的功能:
inline Matrix makeTranslation(const Vector factor) __attribute__ ((always_inline));
Run Code Online (Sandbox Code Playgroud)
您如何看待每个案件的通话费用?
我在 C 中编写了仅包含头文件的小库和static-inline仅库。当应用于大型库时,这会是一个坏主意吗?或者是否有可能使用仅标头版本的运行时间会更快?好吧,不考虑明显的编译时间差异。
我需要在 SQL 服务器中调用函数但出错了!
cannot find either column "dbo" or the user-defined function or
aggregate "dbo.udf_Sum_ExtraHours", or the name is ambiguous.
Run Code Online (Sandbox Code Playgroud)
我有昨天从堆栈中获得的函数,当我在 Management Studio 中单独测试它时,它运行良好,但是当我将它放入内联函数并需要调用存储过程时,它会抛出提到的错误,
我保存的功能是:
ALTER FUNCTION dbo.udf_Sum_ExtraHours
(
@strt date,
@end date
)
RETURNS TABLE
AS
RETURN
WITH cte
AS (
SELECT ExtraHrs
,CASE
WHEN left(ExtraHrs, 1) = '-'
THEN - 1
ELSE 1
END AS multiply
,right(ExtraHrs, 8) AS timestring
,
--get hours in seconds:
DATEPART(HOUR, right(ExtraHrs, 8)) * 3600 AS h_in_s
,
--get minutes in seconds:
DATEPART(MINUTE, …Run Code Online (Sandbox Code Playgroud) sql-server stored-procedures inline-functions sql-server-2008
我有这个用 Kotlin 编写的函数
inline fun <T> handleEmptyResult(observable: Observable<T>,
crossinline resultEmptyCheckingFunc: (obj: T?) -> Boolean): Observable<T> {
return observable
.flatMap {
if (resultEmptyCheckingFunc(it)) {
Observable.error<T>(ResultEmptyError(Throwable()))
} else {
Observable.just(it)
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我为此函数创建单元测试时,它在报告上显示 0 覆盖率。我正在使用 jacoco 进行代码覆盖。你们知道如何正确地对内联函数进行单元测试吗?谢谢!
通过使用SonarLint分析代码,我收到了一条关于析构函数的消息(问题的标题),其声明如下:
class Foo
{
public:
. // default ctor
. // parameterized ctor
.
inline ~Foo() = default; // dtor
.
. // copy ctor = delete
. // copy assignment operator = delete
. // move ctor
. // move assignment operator
private:
...
mutable std::vector< std::vector<char> > m_Matrix;
...
};
Run Code Online (Sandbox Code Playgroud)
以下是消息的描述: 声明函数或静态成员变量 constexpr 使其隐式内联。
我不认为此类的 dtor 可以是constexprorconsteval因为它具有类型的非静态数据成员std::vector,因此~Foo必须delete[]在某个时刻调用以释放向量的存储。
那么为什么SonarLint显示此消息呢?是因为吗 = default?是否有任何 …
c++ destructor inline-functions sonarlint constexpr-function
inline-functions ×10
c ×7
c++ ×4
android ×1
debugging ×1
destructor ×1
external ×1
gdb ×1
header-only ×1
kotlin ×1
loops ×1
recursion ×1
sonarlint ×1
sql-server ×1
static ×1
unit-testing ×1