草庐IT

CF_EXTERN_C_BEGIN

全部标签

c++ - 在不使用 extern "C"的情况下从 C 调用 C++ 函数

是否可以从C代码调用C++DLL中的函数?该函数未声明extern"C"。仅适用于VisualStudio的丑陋的平台相关hack很好。调用约定不应该是一个主要问题,但我该如何处理名称修改。?例如,在VisualStudio中,带有签名voidf()的C++函数的名称被破坏了?f@@YAXXZ,这不是合法的C标识符。(您不需要告诉我应该将C++函数声明为extern"C"。我已经知道了。但我处于无法更改C++代码的情况。) 最佳答案 将违规函数包装在另一个C++函数中,并使用extern"C"声明它。无需为其创建特殊的DLL,只需在

c++ - 使用 std::begin 和 std::end 进行 vector 初始化

为什么可行?有两个不同的字符串"testString"但vector大小分配正确。#include#include#includeintmain(){std::vectorstr;str.assign(std::begin("testString"),std::end("testString"));copy(str.begin(),str.end(),std::ostream_iterator(std::cout,""));std::cout 最佳答案 你很幸运,编译器执行了stringpooling优化。请注意,您所做的仍然是未定

c++ - 用 c 包装一个 c++ 库? (不要 "extern c")

是否可以将c++库包装到c中?我该怎么做?有现成的工具吗?(需要访问现有的c++库,但只能使用C) 最佳答案 您可以用C编写面向对象的代码,因此如果它是面向对象的C++库,则可以将其包装在C接口(interface)中。然而,这样做可能会非常乏味,尤其是当您需要支持继承、虚函数和诸如此类的东西时。如果C++库采用通用编程(模板),它可能会变得非常棘手(您需要提供所有需要的模板实例)并很快接近不值得这样做的地步。假设它是OO,下面是如何在C中实现OO的基本草图:C++类:classcpp{public:cpp(inti);voidf(

c++ - 什么时候使用 extern "C"?

我知道如何使用extern"C"但必须在什么条件下使用它?extern"C"tellstheC++compilernottoperformanyname-manglingonthecodewithinthebraces.ThisallowsyoutocallCfunctionsfromwithinC++.例如:#includeintmain(){chars[]="Hello";chard[6];strcpy_s(d,s);}虽然这在VC++上编译得很好。但有时这会写成:extern"C"{#include}我不明白这一点。你能举一个需要extern"C"的真实例子吗?

C++ 是否在恒定时间内执行 std::set、std::map 等的 begin/end/rbegin/rend?

对于std::set和std::map等以对数时间查找的数据类型,实现是否需要维护开始和结束迭代器?访问begin和end是否意味着查找可能以对数时间发生?我一直假设开始和结束总是在常数时间内发生,但是我在Josuttis中找不到任何对此的证实。既然我正在做一些我需要对性能有所了解的事情,我想确保涵盖我的基础。谢谢 最佳答案 它们发生在常数时间内。我正在查看ISO/IEC14882:2003标准的第466页:表65-容器要求a.开始();(恒定的复杂性)a.end();(恒定的复杂性)表66-可逆容器要求a.rbegin();(恒定

c++ - C++中extern "C"有什么作用?

将extern"C"放入C++代码中究竟有什么作用?例如:extern"C"{voidfoo();} 最佳答案 extern"C"使C++中的函数名称具有C链接(编译器不会破坏名称),以便客户端C代码可以使用C兼容header链接(使用)您的函数只包含函数声明的文件。您的函数定义包含在二进制格式中(由您的C++编译器编译),然后客户端C链接器将使用C名称链接到该二进制格式。由于C++具有函数名称的重载而C没有,C++编译器不能仅使用函数名称作为链接的唯一ID,因此它通过添加有关参数的信息来破坏名称。C编译器不需要破坏名称,因为您不能

c++ - 公开 begin() 和 end() 的 const 和非常量版本,以使用智能指针迭代成员 vector

//目录.hclassCat{public:voidconst_meow()const{...};voidmeow(){...};};classCatLibrary{public:std::vector>::iteratorbegin(){returnm_cat_list.begin();}//compileerror,thecompilercomplainscannotcoverttype//from`std::vector>::const_iterator`//to`std::vector>::const_iterator`std::vector>::const_iteratorb

c++ - 为什么他们坚持在下面的示例中使用 `extern` 说明符?

[basic.link]/6(我的重点):Thenameofafunctiondeclaredinblockscopeandthenameofavariabledeclaredbyablockscopeexterndeclarationhavelinkage....staticvoidf();staticinti=0;voidg(){externvoidf();//internallinkageinti;//#2ihasnolinkage{externvoidf();//internallinkage[basic.link]/7:...namespaceX{voidp(){q();//

c++ - 仅在 header 中的extern变量意外起作用,为什么?

我当前正在更新Arduino的C++库(使用avr-gcc编译的8位AVR处理器)。通常,默认Arduino库的作者喜欢在header中包含该类的extern变量,该变量也在.cpp类文件中定义。我认为基本上是为了让新手能够将所有东西都准备好作为内置对象。我遇到的情况是:我更新的库不再需要.cpp文件,并且已将其从库中删除。直到我进行最后一遍检查发现的错误之后,尽管没有为.cpp文件中的extern变量提供定义的事实,但没有产生链接器错误。这很简单,我可以得到它(头文件):structFoo{voidmethod(){}};externFoofoo;包含此代码并将其用于一个或多个源文件

c++ - 扭曲的逻辑 : a global variable in one file refers to an extern variable but is also referred by that extern variable

文件A.cpp:#includeexternintiA;externintiB=iA;intmain(){std::cout文件B.cppexternintiB;externintiA=2*iB;编译链接运行,out进来debug和release模式是0,0我的问题是它是如何工作的,为什么在链接阶段没有问题?我正在使用VC++2003。 最佳答案 初始化程序覆盖了extern关键字,因此这没有什么“神奇”:您只是在不同的翻译单元中声明和定义两个完全不相关的变量。来自StandardforProgrammingLanguageC++-