草庐IT

c++ - 带有 C++ 的 extern C 是否避免了在 C 中合法但在 C++ 中不合法的未定义行为?

如果您将externC与C++文件一起使用,是否允许在C++中未定义的已定义C行为?废话.hextern"C"{structx{intblah;charbuf[];};char*get_buf(structx*base);structx*make_struct(intblah,intsize);}some_random.cpp#include"blah.h"...x*data=make_struct(7,12);std::strcpy(get_buf(data),"hello");是在C的灵活数组成员中使用定义的行为,这样使用时定义的行为? 最佳答案

c++ - C/C++ 稀有关键字 - register、volatile、extern、explicit

很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。为了帮助澄清这个问题以便可以重新打开它,visitthehelpcenter.关闭11年前。您能否简要介绍一下这4个关键字的用途和原因?我了解google会告诉您的关于register和volatile的基本知识,但想了解更多(只是一个实用的概述)。外部和显式让我有点困惑,因为尽管做了相当低级的嵌入式系统代码,但我从来没有找到自己必须使用它们的理由。再说一次,我可以用谷歌搜索,但我更喜欢专家提供的快速实用的总结,以便牢记在心。 最佳答案

c++ - extern C 和 C++ 用于单个函数(bsearch/qsort)的目的是什么?

这个问题在这里已经有了答案:Isthespecificationof`bsearch`inC++11&C++14defective?(1个回答)关闭5年前。在浏览标准草案(N4527)时,我发现了以下段落([alg.c.library]):Thefunctionsignature:bsearch(constvoid*,constvoid*,size_t,size_t,int(*)(constvoid*,constvoid*));isreplacedbythetwodeclarations:extern"C"void*bsearch(constvoid*key,constvoid*bas

c++ - 为什么 extern “C” 在这里分组 C++ 类(不是标题)?

我在搜索SVM库时遇到了BudgetedSVM.在源码中,我发现了一个不寻常的用法,就像这样:#sample.h#ifndefSAMPLE_H#defineSAMPLE_H//noheaderincludedornamespacedeclaredhere#ifdef__cplusplusextern"C"{#endif//noheaderincludedornamespacedeclaredtooclassSample:publicParent{public:Sample();~Sample();type0fun(type1val1,type2val2);...};#ifdef__cp

C++ : Extern C Functions inside a Namespace

我必须链接两个库,比如A和B。其中一些文件在两个库中是通用的。所以,我在命名空间内的库A中声明函数,比如abc。因此,在A和B中,函数func如下所示:[inA]namespaceabc{extern"C"voidfunc();}[inB]extern"C"voidfunc();在构建项目时,编译器会抛出链接错误,说明函数func的多个定义。是不是命名空间内的A中的函数func或者外部“C”函数是否存在问题。如果有,那么我该如何区分它们呢? 最佳答案 当您使用Extern"C"时,您将关闭名称修饰,因此您会丢失命名空间信息,因为C没

c++ - c++中extern的使用

我很难理解“外部”的工作原理。我搜索了谷歌,但似乎没有我正在尝试的特定示例如果我有一个引用one.h的文件main.cpp在其中我有一个名为LIST1的列表(这是一个100x100的双数组)所以我有双List1[100][100];请问如何在one.cpp中使用此列表?externdoubleLIST1[100][100]不工作:/main.cpp:#include"one.h"externdoubleLIST1[100][100];一个.cpp:voidone::useList(){for(j=0;j这就是我所拥有的。我得到的错误:1>main.obj:errorLNK2001:un

c++ - 将 main 声明为 extern "C"是否合法 C++?

作为一名低级程序员,我经常使用可执行文件的模块启动代码,因此我非常了解“crt0”之类的代码是如何工作的。在编写C++代码时,我通常将main声明为extern"C"以匹配C启动代码将要调用main。因此,我通常将此声明用于main(如果专门针对Windows,则使用wmain):extern"C"intmain(intargv,constchar*const*argv)extern"C"int__cdeclwmain(intargv,constwchar_t*const*argv)在main上使用extern"C"是否合法?另外,对于argv的类型,constchar*const*是

c++ - 使用 "extern template"时专门化模板的正确方法是什么?

我希望有人能指出在使用“extern模板类”和“模板类”进行显式实例化的gnuc++时,在模板类中专门化方法的正确方法。我试图用模仿我真正问题的最简单的例子来解决这个问题。似乎声明“外部模板”意味着模板实例化,它在专门化方法时会导致错误。给定一个驱动程序:main.cc#includeA_H#includeintmain(){Aai;Aal;std::cout以及以下A的实现啊。templatestructA{intget()const;};externtemplateclassA;externtemplateclassA;a.cc#include"a.h"templateintA::

c++ - 标记为 Extern "C"的 C++ 函数可以抛出吗?

我有想要使用extern"C"声明的C++函数,即使它们只在C++代码中调用。是的,我知道这很奇怪,但为了保持一致性,我想这样做,因为我们混合了C和C++声明。我只是想确保将C++函数声明为extern"C"不会影响抛出的行为。看起来像这样:extern"C"voidfoo(){throwexception;}intbar(){try{foo();}catch(exceptione){return1;}} 最佳答案 “标记为外部“C”的C++函数可以抛出吗?”是的,无论是语言还是编译器都不会阻止您这样做。否,从某种意义上说,如果你抛

c++ - extern "C"声明如何工作?

我正在学习编程语言类(class),我们正在讨论extern"C"声明。除了“它接口(interface)C和C++”之外,这个声明在更深层次上是如何工作的?这对程序中发生的绑定(bind)也有什么影响? 最佳答案 extern"C"用来保证后面的符号不是mangled(装饰)。示例:假设我们在一个名为test.cpp的文件中有以下代码:extern"C"{intfoo(){return1;}}intbar(){return1;}如果你运行gcc-ctest.cpp-otest.o看看符号名称:00000010T_Z3barv000