Tag: 内联

链接器错误内联函数

我有一些编译器/链接器错误,我不知道什么是正确的方法来继续。 我遇到这种情况: 啊:在这个文件中定义了一个声明为“inline”的函数,例如:inline void foo1(); bh:在这个文件中定义了一个声明为“inline”的函数,它调用foo1():inline void foo2(); main.c:foo1和foo2()都有一些函数调用。 现在,如果我在ah和bh中声明foo1和foo2作为extern inline void我得到以下错误: prj / src / bo:在函数foo1′: (.text+0x0): multiple definition of :(。text + 0x0):foo1’prj / src / main.o :(。text + 0x0)的foo1′: (.text+0x0): multiple definition of :这里首先定义make: * [kernel]错误1 在我描述的情况下,允许编译和链接而没有错误/警告的方式是什么?

传递给C函数的指针值不正确

我有一个错误,其中一个不正确的值作为参数传递给C程序中的函数。 它的工作方式是,我将一个指向typedef-ed数据结构的静态指针声明为全局变量。 有一个初始化函数,其中初始化了该变量。 此函数分配内存,初始化数据字段并返回指针。 像这样的东西: static my_type *my_ptr; … void init(void){ my_ptr = init_my_type(); } 函数init_my_type非常简单: void *init_my_type(void){ my_type *x = malloc(sizeof(my_type); x->arg1 = 0; … // more field initializations return x; } 后来我使用my_ptr作为另一个函数的参数: void do_stuff(void){ func(my_ptr); } 我遇到的问题是,当访问my_ptr指向的数据结构中的某些数据时,我会在func中my_ptr 。 当我运行调试器时,当我在init_my_type上中断时,我得到一个漂亮的hex值: (gdb) finish Value returned is $26 (void *) 0x79b6c0 稍后,在do_stuff函数中, my_ptr具有相同的hex值: (gdb) print my_ptr […]

函数仅在标题中定义时才会内联。 我错过了什么吗?

使用gcc v4.8.1 如果我做: //func.hpp #ifndef FUNC_HPP #define FUNC_HPP int func(int); #endif //func.cpp #include “func.hpp” int func(int x){ return 5*x+7; } //main.cpp #include #include “func.hpp” using std::cout; using std::endl; int main(){ cout<<func(5)<<endl; return 0; } 即使是简单的函数func也不会内联。 原型和/或定义上没有inline , extern , static和__attribute__((always_inline))的组合改变了这一点(显然这些说明符的某些组合导致它甚至不编译和/或产生警告,而不是讨论那些) 。 我正在使用g++ *.cpp -O3 -o run和g++ *.cpp -O3 -S来进行汇编输出。 当我查看程序集输出时,我仍然看到call func 。 它似乎只有我能够正确内联函数的方法是拥有原型(可能没有必要)和头文件中函数的定义。 如果标题仅包含在整个程序中的一个文件中(例如仅由main.cpp包含),则它将进行编译,并且函数将被正确内联,甚至不需要inline说明符。 如果要将标头包含在多个文件中,则似乎需要inline说明符来解决多个定义错误,这似乎是其唯一目的。 […]

GCC内联汇编’Nd’约束

我正在用C开发一个小玩具内核。我需要从键盘获取用户输入。 到目前为止,我已使用以下代码实现了inb : static inline uint8_t inb(uint16_t port) { uint8_t ret; asm volatile(“inb %1, %0” : “=a”(ret) : “Nd”(port)); return ret; } 我知道”=a”约束意味着al/ax/eax将被复制到ret作为输出,但我仍然对”Nd”约束感到困惑。 任何人都能提供一些有关为什么需要这种约束的见解? 或者为什么我不能只使用像”r”或”b”这样的通用寄存器约束? 任何帮助,将不胜感激。

变形示例代码

所以我一直致力于实现James Holderness的变形代码示例 : Metamorphic Code Examples 。 #include #include #include #include #include #define PUSH 0x50 #define POP 0x58 #define MOV 0xB8 #define NOP 0x90 #define ADD 0x01 #define AND 0x21 #define XOR 0x31 #define OR 0x09 #define SBB 0x19 #define SUB 0x29 #define JUNK asm __volatile__(PUSH,NOP,NOP,NOP,NOP,NOP,NOP,NOP,NOP,POP) #define JUNKLEN 8 const unsigned char prefixes[] = {ADD, […]

内联函数的前向声明

我有一个头文件,将包含大量(30+)内联函数。 我没有让读者滚动或搜索内联函数的定义(实现),而是希望有一个前向声明部分,它声明函数声明以及描述函数的注释。 本节将允许读者了解如何使用函数或查找函数,而无需向下滚动到实现。 此外,我希望读者养成使用函数的习惯,而不必看到他们的实现。 独立函数的前向声明的语法是什么? {这适用于C99和C ++} 仅供参考,我使用IAR Workbench C编译器设置使用C99。

GCC会内联一个带指针的函数吗?

我有一个函数,它对一段数据进行操作(比方说,一个int ),我想通过传递对valule的引用来改变它。 因此,我有函数: void myFunction(int *thing) { … } 。 当我使用它时,我称之为: myFunction(&anInt) 。 由于我的function经常被调用(但是来自许多不同的地方),我担心它的性能。 我将其重构为函数的原因是可测试性和代码重用。 编译器是否能够优化函数,将其内联直接在我的anInt变量上运行? 我希望你能按照它所要求的精神来接受这个问题(即我不会过早地担心优化问题,我对答案感到好奇)。 同样,我不想把它变成一个宏。

(如何)我可以内联特定的函数调用吗?

假设我有一个在程序的多个部分中调用的函数。 我们还要说我对该函数的特定调用是在一个性能极其敏感的代码段中(例如,循环迭代数千万次,每微秒计数一次)。 有没有办法可以强制编译器(在我的情况下为gcc )内联单个特定函数调用,而不是内联其他函数? 编辑:让我完全清楚:这个问题不是强迫 gcc(或任何其他编译器)内联所有函数调用; 相反,它是关于请求编译器内联对函数的特定调用 。

内联函数与宏函数

可能重复: 内联函数与预处理器宏 我想知道内联函数和宏函数之间的区别。 1)内联函数是否与宏函数相同? 2)我知道两者都没有被调用,但它们在编译阶段被代码替换。 不是? 3)如果有差异,你能指定吗?

内联定义

pg474,KNKing “C99中的一般规则是,如果特定文件中函数的所有顶级声明都包含内联而非外部,那么该文件中函数的定义是内联的。” 什么是:“function的顶级声明”?? “如果函数在程序中的任何地方使用(包括包含其内联声明的文件),那么函数的外部声明将需要由其他文件提供。当调用该函数时,编译器可以选择执行一个普通的调用(使用函数的外部定义)或执行内联扩展(使用函数的内联定义)。无法确定编译器将选择哪个选项,因此两个定义保持一致至关重要。“ 他在这说什么? “具有静态存储持续时间的变量是具有外部链接的内联函数的特殊问题” 但我认为你无法通过外部链接调用函数! 编译器会给出一个错误: 第473页 “所以试图从另一个文件中调用平均值将被视为错误” “因此,C99对具有外部链接的内联函数施加了以下限制(但不对具有内部链接的内联函数施加限制):该函数可能未定义可修改的静态变量。该函数可能不包含对具有内部链接的变量的引用。” 为什么?? 如果函数是内联函数和外部函数,那么即使它确实声明了一个静态int i; 由于函数无法链接到你无法调用它,但是不会在内联函数堆栈框架外创建静态变量 – 所以你应该能够链接到它? 内联函数有堆栈框架吗? 这里发生了什么??