Tag: extern

为什么’extern’存储类在函数中的工作方式不同?

以下代码段正常 extern int i; int i; int main(){ return 0; } 我得到的是,’i’被声明然后被定义。 由于只有一个定义,所以完全没问题。 int main(){ extern int i; int i; return 0; } 现在,上面的一个给出了以下错误 new.cpp: In function ‘int main()’: new.cpp:5:6: error: redeclaration of ‘int i’ int i; ^ new.cpp:4:13: note: previous declaration ‘int i’ extern int i; 问题出在这里? 这里也有’i’的单一定义。

理解C中的`extern`存储类说明符

考虑给定的C代码: #include extern int i; int main(){ printf(“%d”, i); return 0; } 它给出了Compilation error 。 如果我初始化extern int i=10; 然后输出是10 。 #include extern int i=10; //initialization statement int main(){ printf(“%d”, i); return 0; } 而且,如果我指定int i=10; 然后输出是10 。 #include extern int i; int i=10; //assignment int main(){ printf(“%d”, i); return 0; } 和 #include extern int […]

C中const的外部链接

当我遇到这种奇怪的行为时,我正在使用C中的 extern关键字。 我有两个文件: 在file1.c #include int main() { extern int a; a=10; printf(“%d”,a); return 0; } file2.c中 const int a=100; 当我一起编译这些文件时,没有错误或警告,当我运行它们时,输出变为10 。 我原以为编译器应该在a=10;行报告错误a=10; 。 此外,如果我将file2.c的内容更改为 const int a; 也就是说,如果我删除全局const变量a的初始化然后编译文件,仍然没有错误或警告,但是当我运行它们时,会发生分段错误。 为什么会出现这种现象? 它是否归入未定义的行为? 这是编译器还是机器依赖的? PS:我看过很多与此问题相关的问题,但要么是C ++,要么只讨论extern 。

怀疑与外部关键字使用有关

AFAIK,extern关键字应该用于声明,并且没有值可以与使用extern关键字声明的变量相关联。 但是假设我写了一个类似的声明 extern int i = 10; 编译器是否应标记错误? 我看到一些编译器容忍并忽略了这一点? 为什么会这样? ‘C’标准对此有何看法? 编辑:@All,谢谢你的回答。 我仍有疑问。 假设我有这个变量的定义而没有另一个文件中的extern链接说ac和我在bc中添加这个语句仍然可以编译器不标记错误吗? 它是否会被重新定义?

C隐式的全局变量extern,它什么时候发生,它是如何工作的

我试图理解在多个文件(编译单元)之间共享C全局变量的方式。 我在这里读到了很好的问题和答案。 然而,经过一些测试后,我仍然留下一些我没有得到的东西: 基本上我的问题是:如果在没有extern关键字的头中声明了(但未定义)变量,是否可以简单地将该头包含在各种编译单元中,以便将该变量提供给所有这些编译单元? 在这种情况下,暗示一个(并且只有一个)编译单元包含用于初始化(定义?)该变量的代码,并且在其他编译单元尝试对该变量执行任何操作之前将首先调用该代码。 如果这一切都是真的,那么这个程序被称为“隐式外部”吗? 我将用一个例子说明我的问题: 标题“MyCommonHeader.h”包含: //MyCommonHeader.h int* i; //pointer to an int 文件MyFirstHeader.h包含: //MyFirstHeader.h void changeIt(int newValue); 文件MyFirstSource.c包含: //MyFirstSource.c #include “MyFirstHeader.h” void changeIt(int newValue) { *i = newValue; } 文件MySecondSource.c包含: //MySecondSource.c #include “MyCommonHeader.h” #include “MyFirstHeader.h” void main() { i = malloc(sizeof(int)); changeIt(10); *i = 23; } 以上代码是否在所有地方都使用相同的i变量? 我需要在任何地方添加extern吗?

C函数调用C ++成员函数 – 其中C代码是用C编译器编译的

请关闭之前,阅读问题,看看为什么它不同(提示:它是C编译器) 我已经谷歌搜索了很多很多关于C函数如何调用C ++成员函数的解释。 它们看起来都类似于这个问题的接受答案,来自一个非常高的rep成员。 它说 在头文件中,放 extern “C” void* MyClass_create() { return new MyClass; } extern “C” void MyClass_release(void* myclass) { delete static_cast(myclass); } extern “C” void MyClass_sendCommandToSerialDevice(void* myclass, int cmd, int params, int id) { static_cast(myclass)->sendCommandToSerialDevice(cmd,params,id); } 并且,在C代码中,放 void* myclass = MyClass_create(); MyClass_sendCommandToSerialDevice(myclass,1,2,3); MyClass_release(myclass); 这看起来很简单,但我不明白的是头文件必须引用MyClass (不要介意static_cast ),但我想用C编译器(gcc)编译我的C代码,而不是C ++编译器(克++)。 它不会起作用。 如何从C代码调用C ++成员函数 – 这是用C编译器编译的?

CUDA外部纹理声明

我想声明我的纹理一次,并在我的所有内核和文件中使用它。 因此,我在标题中将其声明为extern并在所有其他文件中包含标题(遵循SO 如何使用extern在源文件之间共享变量? ) 我有一个包含我的纹理的标题cudaHeader.cuh文件: extern texture texImage; 在我的file1.cu ,我分配了我的CUDA数组并将其绑定到纹理: cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc( ); cudaStatus=cudaMallocArray( &cu_array_image, &channelDesc, width, height ); if (cudaStatus != cudaSuccess) { fprintf(stderr, “cudaMallocArray failed! cu_array_image couldn’t be created.\n”); return cudaStatus; } cudaStatus=cudaMemcpyToArray( cu_array_image, 0, 0, image, size_image, cudaMemcpyHostToDevice); if (cudaStatus != cudaSuccess) { fprintf(stderr, “cudaMemcpyToArray failed! Copy from the host […]

为什么GCC编译并链接两个文件,即使没有使用’extern’?

以下是用两个单独的文件Test1.c和Test2.c编写的两个独立代码。 我没有在任何文件中使用extern关键字。 //Test1.c #include int a = 1; int main() { printf(“test1 – a val = %d\n”,a); fn(); printf(“After Return : %d”,a); } //Test2.c #include int a; int fn() { printf(“test2 – a val = %d\n”,a); a++; } 我用gcc编译了这段代码: gcc Test1.c Test2.c 它生成以下输出: test1 – a val = 1 test2 – a val = 1 […]

在运行时定义的C ++全局外部常量可用于多个源文件

我有一个在运行时定义的整数常量。 此常量需要在全局和多个源文件中可用。 我目前有以下简化情况: ClassA.h声明了extern const int someConstant; ClassA.cpp在某些时候使用someConstant 。 Constants.h声明了extern const int someConstant; main.cpp包括ClassA.h和Constants.h ,声明const int someConstant ,并且在main()期间的某个时刻尝试在运行时将someConstant初始化为实数值。 这与一个char *常量完美地工作,我使用它来使程序的名称在所有文件中全局可用,并且它的声明和定义与我试图在这里声明和定义的那个完全相同,但我无法得到它使用int 。 我得到第一个error: uninitialized const ‘someConstant’ [-fpermissive]在我在main.cpp声明它的行,后来我得到一个error: assignment of read-only variable ‘someConstant’我认为是error: assignment of read-only variable ‘someConstant’是因为someConstant正在初始化默认值。 有没有办法做我想在这里实现的目标? 提前致谢! 编辑 (根据@WhozCraig的要求):相信我:它是不变的。 我没有发布MCVE的原因是由于三个原因:这是一个任务,源是西class牙语,因为我真的想把问题保持为一般(并且可重复使用)。 我开始写这个例子,中途它打击了我不是最清楚的问题。 我会再试一次解释。 我被要求构建一个程序来创建一个进程,该进程又生成两个孩子(这些孩子反过来会产生两个孩子,依此类推)。 该程序将生成的代数视为单个参数。 基本上创建一种二进制过程树。 每个过程都必须提供有关他自己,他的父母,与原始过程的关系以及他的孩子(如果有的话)的信息。 因此,在上面的示例中, ClassA实际上是一个包含有关进程信息的类(PID,PPID,子PID,与原始进程的关系程度等)。 对于每个fork我创建了这个类的新实例,因此我可以“保存”这些信息并将其打印在屏幕上。 当我定义与原始进程的关系时,我需要知道在调用程序时使用的参数,以检查此进程是否没有子进程(以更改该特定进程的输出)。 这是我需要的main常数:产生的世代数,树的“深度”。 编辑2 :我将不得不道歉,这是漫长的一天,我没有直接思考。 我将源代码从C切换到C […]

C ++:extern“C”和类成员之间的命名空间冲突

我偶然发现了一个相当奇特的c ++命名空间问题: 浓缩的例子: extern “C” { void solve(lprec * lp); } class A { public: lprec * lp; void solve(int foo); } void A::solve(int foo) { solve(lp); } 我想在我的C ++成员函数A :: solve中调用c函数solve。 编译器对我的意图不满意: error C2664: ‘lp_solve_ilp::solve’ : cannot convert parameter 1 from ‘lprec *’ to ‘int’ 有什么我可以在解决function的前缀? C :: solve不起作用