首页 > 系统相关 >__attribute__修饰使用在linux编程中的使用

__attribute__修饰使用在linux编程中的使用

时间:2022-11-25 16:03:59浏览次数:37  
标签:__ int attribute void func linux main

int __attribute__((weak)) func();

当我们用__attribute__((weak))修饰func()函数后,func就是一个弱符号。不管外部是否定义了func()我们都可以链接通过,当外部定义了就调用外部的func函数,当外部没有定义时就调用本模块的func函数。但实际上本模块并没有定义func函数,所以在调用时我们判断一下函数指针是否为空,以免造成段错误。

案例:

main.cpp

#include <iostream>

int __attribute__((weak)) add(int a, int b)
{
printf("weak add called\n");
return 0;
};

using namespace std;
int main()
{
int a = add(1, 2);
printf("weak result:%d\n", a);
return 0;
}

strong.cpp

#include <stdio.h>
int add(int a, int b)
{
printf("strong add called\n");
return a + b;
}

1.只编译main.cpp,编译成功。main中调用的是 weak修饰的add

2.编译main.cpp和strong.cpp, 编译成功。main中调用的是strong.cpp中的add


static void Create(void) __attribute__((constructor))

​__attribute__((constructor))​​修饰函数是在​​main​​函数之前执行的函数。

static void Destory(void) __attribute__((destructor));

​__attribute__((constructor))​​修饰函数是在​​main​​函数之后执行的函数。

案例:

main.cpp

#include <iostream>

#define MODULE_CONSTRUCTOR(void) static void Create(void) __attribute__((constructor)); static void Create(void)

#define MODULE_DESTRUCTOR(void) static void Destory(void) __attribute__((destructor)); static void Destory(void)

MODULE_CONSTRUCTOR(void)
{
printf("constructor called\n");
}

MODULE_DESTRUCTOR(void)
{
printf("destructor called\n");
}

using namespace std;
int main()
{
printf("main called\n");
return 0;
}

下面调用顺序:左中右,可以看出constructor和destructor的调用时机

__attribute__修饰使用在linux编程中的使用___attribute__

标签:__,int,attribute,void,func,linux,main
From: https://blog.51cto.com/u_15081352/5886834

相关文章

  • 麻了,三个offer不知道选哪个?
    果然鲁迅先生说的不错,人与人之间的悲欢并不相通有的小伙伴苦于没有面试,有的小伙伴却苦于offer太多不知道选择哪个?一、拿到的offer阿里:阿里云数据库方向,地址北京/杭州,年薪50......
  • BGP 基本概述
    BGP属于边界网关路由协议是一种EGP路由协议,其主要作用在各个AS自治系统之间传递路由信息,是大型网络之间互联的路由协议。基本像我这种小网工很难接触到,但是确实这个协......
  • 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!
    ​​ 李华明Himi ​​​原创,转载务必在明显处注明 很多童鞋说我的代码运行后,点击home或者back后会程序异常,如果你也这样遇到过,那么你肯定没有仔细读完Himi的博文,第十九......
  • 【J2me3D系列学习文章之二】(立即模式)构造我们3D世界中的第一个立方体!
    Himi 原创,转载请注明!谢谢。   3D设计的里程碑。     首先介绍构造一个3D立方体需要的步骤:(大概步骤哦)    第一:构造一个立方体的空间顶点    ......
  • [Object-C语言随笔之一]Mac os 下搭建iOS开发环境
    ​​ 李华明Himi ​​​原创,转载务必在明显处注明 从这一章开始,Himi将一步一步的带大家走进Iphone4的开发,当然开发语言则不再是Java,而是Objective-C,简单来说是C的变种......
  • SimSolid无网格建模工程快速仿真软件
    AltairSimSolid可在几分钟内对结构复杂的CAD装配体进行结构分析。它可以消除传统结构仿真中特别耗时、特别专业且非常易出错的几何准备和网格划分任务。可在现实条件下......
  • 一些有用的CSS样式
    /*1.垂直对齐容器中的元素*/.verticalcenter{  position:relative;  top:50%;  -webkit-transform:translateY(-50%);  -......
  • 分支结构
    【例3-1】简单的猜数游戏。输入你所猜的整数(假定1~100),与计算机产生的被猜数比较,若相等,显示猜中;若不等,显示与被猜数的大小关系。#include<stdio.h>intmain(void){intmynu......
  • 为什么Redis 是单线程却能支撑高并发?
    最近在看UNIX网络编程并研究了一下Redis的实现,感觉Redis的源代码十分适合阅读和分析,其中I/O多路复用(mutiplexing)部分的实现非常干净和优雅,在这里想对这部分的内容进......
  • 【Android游戏开发十四】深入Animation,在SurfaceView中照样使用Android—Tween Anima
    ​​ 李华明Himi ​​​原创,转载务必在明显处注明 很多童鞋说我的代码运行后,点击home或者back后会程序异常,如果你也这样遇到过,那么你肯定没有仔细读完Himi的博文,第十九......