草庐IT

COREDATA_EXTERN

全部标签

C++ extern的妙用

在C++编程中,extern关键字的使用是一种强大的工具,它允许我们在一个源文件中声明变量或函数,而在另一个源文件中定义它。这样,我们可以方便地共享代码和数据,同时保证了编译的独立性,使项目结构更加清晰。一、extern关键字的基础知识在C++中,extern关键字主要用于声明一个变量或函数的作用范围(scope)是全局的。当我们在一个源文件中使用extern关键字声明一个变量或函数时,其他源文件就可以访问和修改这个变量或函数。二、extern关键字的典型用法1.共享全局变量使用extern关键字可以方便地在多个源文件中共享全局变量。在定义全局变量时,我们只需要在一个源文件中使用extern关

c++ - extern "C"默认参数是否有效?

来自Here似乎C不支持默认参数。我在导出的库中有以下方法:extern"C"{__declspec(dllexport)uintptr_tMethod(intfreq,int*pRetval,bool*support2MHz);}如果我像这样将最后一个参数设为可选:extern"C"{__declspec(dllexport)uintptr_tMethod(intfreq,int*pRetval,bool*support2MHz=NULL);}我的dll仍在编译中。我的问题是为什么?每个人都说C代码不支持默认参数。我在MS2015中使用C++。 最佳答案

c++ - extern 关键字真的有必要吗?

...#include"test1.h"intmain(..){countaaa定义在test1.h中,我没有使用extern关键字,但仍然可以引用aaa。所以我怀疑extern真的有必要吗? 最佳答案 extern有其用途。但它主要涉及不受欢迎的“全局变量”。extern背后的主要思想是用外部链接来声明事物。因此,它有点与static相反。但在许多情况下,外部链接是默认链接,因此在这些情况下您不需要extern。extern的另一个用途是:它可以将定义变成声明。示例:externinti;//Declarationofiwithe

c++ - extern "C"static void* 函数

在阅读了extern和static之后,我很困惑地遇到了具有以下行的代码:extern"C"staticvoid*foo(int*a){returnfoo1(a);}为什么这不会产生任何错误? 最佳答案 以下内容也编译并执行与您的行相同的操作:extern"C"{staticvoid*foo(int*a){returnfoo1(a);}}static意味着foo()将只在文件范围内可用,当它出现时它会覆盖extern"C"到联动。通常,extern"C"会影响链接器在导出时使用的函数的名称,以便在链接整个程序时可以从其他目标文件调用

c++ - 是否可以在 extern "C"函数中使用模板参数

我的要求是使用extern"c"函数从集合中获取一个项目。方法如下template>extern"C"__declspec(dllexport)_Ty*__cdeclGetItem(std::vector*itr,intindex){if(itr->size()at(index);}编译时出现如下错误errorC2988:unrecognizabletemplatedeclaration/definition这个extern方法的使用是使用c#中的pinvoke获取对象数据 最佳答案 不,那是不可能的。该标准禁止模板及其特化具有C链

c++ - 编译程序包含 extern "C"

我正在尝试使用makefile来编译其他人使用cygwin编写的程序。我收到很多错误消息,其中很多人提示error:templatewithClinkage.经过一番搜索后,问题似乎与extern"C"有关.此行包含在文件cygwin/usr/include/pthread.h中,该文件包含在#include中。在其中一个标题中。当我删除这一行时,大多数错误消息都消失了。但是还剩下一些,如下所示:/usr/include/pthread.h:67:5:error:previousdeclarationof‘intpthread_atfork(void(*)(),void(*)(),vo

c++ - 使用 extern const 将结构传递给模板。什么是外部?

我在问自己为什么下面的代码有效,以及说明符extern在实例化baz_instance时做了什么:structbaz{intvalue;};externconstbazbaz_instance={3};templateintfoo(){returnb.value;}intmain(){foo();return1;}为什么上面的代码首先编译,如果省略extern说明符,为什么它不再编译?extern说明符在此示例中的作用是什么? 最佳答案 这是从C++03到C++11的标准部分之一。在C++03中,[temp.arg.nontype]

c++ - C++中extern “C”与extern “C” {}的不同链接

Thisquestionalreadyhasanswershere:Isthereadifferencebetweenwithbracesorwithoutwhenusingextern“C”?(3个答案)2年前关闭。我意识到,乍一看,我的问题似乎很明显是与extern关键字相关的众多问题之一的重复,但是我找不到的任何答案来谈论extern“C”和extern“C”{}。相反,我发现有几个人指出这两个结构是等效的,因为我认为这是合理的。不幸的是,经验证据表明它们实际上与等效。这是一个例子:extern"C"{constintmy_var1=21;}extern"C"constintmy

c++ - extern const char* const SOME_CONSTANT 给我链接器错误

我想像这样在API中提供一个字符串常量:externconstchar*constSOME_CONSTANT;但是如果我在我的静态库源文件中将它定义为constchar*constSOME_CONSTANT="test";当链接到该库并使用SOME_CONSTANT时,我遇到链接器错误:Error1errorLNK2001:unresolvedexternalsymbol"charconst*constSOME_CONSTANT"(?SOME_CONSTANT@@3QBDB)从externconstchar*const声明和定义中删除指针常量(第二个const关键字)使其工作。如何使用

c++ - extern "C"、重载和函数指针可能存在歧义

正常的功能,可以写extern"C"intFrotz(int);//inaheaderintFrotz(intx){returnx;}然而,对于函数指针,这似乎在编译器之间实现不一致。extern"C"intKlutz(int(*)(int),int);intKlutz(int(*fptr)(int),intx){return(*fptr)(x);}在声明中,参数也是extern"C"。在定义中,大多数编译器似乎都匹配这些函数,并使Klutz成为extern"C"函数。然而,Sun和Cray编译器将这些函数解释为不同的,产生了重载的intKlutz(int(*fptr)(int),in