pragma GCC visibility push(default)

  • 编译器选项

    GCC 4.0支持一个新的选项,用于设置源文件中符号的缺省可见性。这个选项是-fvisibility=vis ,您可以用它来设置当前编译的符号的可见性。这个选项的值可以是default(缺省)或者hidden(隐藏),设置为default时,没有显式标识 为hidden的符号都处理为可见;设置为hidden时,没有显式标识为可见的符号都处理为隐藏。如果您在编译中没有指定-fvisibility选 项,编译器会自行处理为缺省的可见性。

  请注意: default设置不是指编译器缺省的处理方式。和hidden设置一样,default来自ELF格式定义的可见性名称。具有default可见性的符号和所有不使用特殊机制的符号具有相同的可见性类型&8212;也就是说,它将作为公共接口的一部分输出。

       编译器还支持-fvisibility-inlines-hidden选项,用于强制隐藏所有的嵌入函数。当您希望对大多数项目使用缺省的可见性,但又希望隐藏所有的嵌入函数时,您可能会用到这个选项。

  • 可见性属性

如果用GCC 4.0编译代码,可以用可见性属性将个别的符号标识为default或hidden:

__attribute__((visibility("default"))) void MyFunction1() {}   
__attribute__((visibility("hidden"))) void MyFunction2() {}

       可见性属性会覆盖编译时通过-fvisibility选项指定的值。因此,增加default可见性属性会使符号在所有情况下都被输出,反过来,增加hidden可见性属性会隐藏相应的符号。

    可见性属性可以应用到函数,变量,模板,以及C++类。如果一个类被标识为hidden,则该类的所有成员函数,静态成员变量,以及编译器生成的元数据,比如虚函数表和RTTI信息也都会被隐藏。

    请注意:虽然模板声明可以用可见性属性来标识,但是模板实例则不能。这是个已知的限制,在GCC的未来版本中可能被修复。

  • Pragmas
       将符号标识为default或者hidden的另外一种方法是使用GCC 4.0新引入的pragma指令。GCC可见性pragma的优点是可以快速地标识一整块函数,而不需要将可见性属性应用到每个函数中。这个pragma的用法如下:
void f() { }
#pragma GCC visibility push(default)
void g() { }
void h() { }
#pragma GCC visibility pop
       在这个例子中,函数g和h被标识为default,因此无论-fvisibility选项如何设置,都会输出;而函数f则遵循-fvisibility选项设置的任何值。push和pop两个关键字标识这个pragma可以被嵌套。


/* Copyright (c) 2009-2017 Dave Gamble and cJSON contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* cJSON */ /* JSON parser in C. */ /* disable warnings about old C89 functions in MSVC */ #if !defined(_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) #define _CRT_SECURE_NO_DEPRECATE #endif #ifdef __GNUC__ #pragma GCC visibility push(default) #endif #if defined(_MSC_VER) #pragma warning (push) /* disable warning about single line comments in system headers */ #pragma warning (disable : 4001) #endif #include <string.h> #include <stdio.h> #include <math.h> #include <stdlib.h> #include <float.h> #include <limits.h> #include <ctype.h> #ifdef ENABLE_LOCALES #include <locale.h> #endif #if defined(_MSC_VER) #pragma warning (pop) #endif #ifdef __GNUC__ #pragma GCC visibility pop #endif #include "JSON.h" /* define our own boolean type */ #define true ((cJSON_bool)1) #define false ((cJSON_bool)0) typedef struct { const unsigned char *json; size_t position; }
最新发布
04-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值