_GNU_SOURCE和__USE_GNU的差别

本文转载至:http://mnstory.net/2015/03/_gnu_source-vs-__use_gnu/#more-371

c-cpp.c:

用gcc编译不过,用g++可以:
$ g++ c-cpp.c
$ gcc c-cpp.c
c-cpp.c: In function ‘main’:
c-cpp.c:12:17: error: ‘REG_R8’ undeclared (first use in this function)
c-cpp.c:12:17: note: each undeclared identifier is reported only once for each function it appears in

其预处理上有差别:
$ gcc siginfo.c -E >gcc.c
$ g++ siginfo.c -E >g++.c

在/usr/include/x86_64-linux-gnu/sys/ucontext.h 文件里,定义了:

经过预处理,gcc.c显示为:

g++.c显示为:

很明显,gcc版本的,没有enum,所有gcc编译不过。

换一下:

看下在gcc下,两者的预处理差别:
/usr/include/features.h 里面,首先会:

然后根据_GNU_SOURCE来定义:

__USE_GNU 不是开放给用户用的,features.h里面会修改,但 _GNU_SOURCE 不会,它才是给用户用的
看features.h里的注释:
These are defined by the user (or the compiler) to specify the desired environment:
_GNU_SOURCE All of the above, plus GNU extensions.

These are defined by this file and are used by the header files to decide what to declare or define:
__USE_GNU Define GNU extensions.

修改方法,在代码最开始,添加:

或者,直接在编译选项里定义。
而gcc和g++的默认定义也有区别,因为g++默认定义了_GNU_SOURCE,所以g++可以编译过而gcc编译不过。

在这里 http://stackoverflow.com/questions/5679267/how-to-resolve-reg-eip-undeclared-first-use-in-this-function-error-on-linux-3 也搜索到答案,但是之前没有太留意。
I believe you should either have #define _GNU_SOURCE as the first line of your source file, or better put -D_GNU_SOURCE in your CFLAGS (on the command line). Then make sure you include and .


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:std::shared_ptr<int> p1 = std::make_shared<int>(5);std::weak_ptr<int> wp1 {p1}; // p1 owns the memory. \[1\] 引用\[2\]:You break this by usingweak_ptr. The "owner" typically useshared_ptrand the "owned" use aweak_ptrto its parent, and convert ittemporarilytoshared_ptrwhen it needs access to its parent.(也就是上面说的弱引用使用方法) Smart pointer 使用方法 \[2\] 引用\[3\]: (1)指向对象的指针,_M_ptr (2)用于控制引用计数的对象,_M_refcount。 4、reset void reset() noexcept { __shared_ptr().swap(*this); } template<typename _Tp1> void reset(_Tp1* __p) // _Tp1 must be complete. { // Catch self-reset errors. _GLIBCXX_DEBUG_ASSERT(__p == 0 || __p != _M_ptr); __shared_ptr(__p).swap(*this); } template<typename _Tp1, typename _Deleter> void reset(_Tp1* __p, _Deleter __d) { __shared_ptr(__p, __d).swap(*this); } template<typename _Tp1, typename _Deleter, typename _Alloc> void reset(_Tp1* __p, _Deleter __d, _Alloc __a) { __shared_ptr(__p, __d, std::move(__a)).swap(*this); } \[3\] 问题:Member 'make_shared' cannot have template 回答: 错误信息"Member 'make_shared' cannot have template"意味着在使用make_shared函数时出现了错误。make_shared是一个模板函数,用于创建一个shared_ptr对象并初始化它所指向的对象。通常情况下,我们可以使用make_shared来创建一个shared_ptr对象,而不需要显式地指定模板参数。例如,std::shared_ptr<int> p1 = std::make_shared<int>(5);可以创建一个指向整数的shared_ptr对象p1,并将其初始化为5。\[1\]然而,如果在使用make_shared时出现了该错误,可能是因为编译器无法正确地推断模板参数。在这种情况下,您可以尝试显式地指定模板参数,例如std::shared_ptr<int> p1 = std::make_shared<int>(5);。\[1\] #### 引用[.reference_title] - *1* *2* [C++ smart pointer](https://blog.csdn.net/u011279649/article/details/121473669)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [GNU C++ 智能指针21- 解析__shared_ptr类9](https://blog.csdn.net/kupe87826/article/details/120512250)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值