Tag: 全局变量

C:函数可以返回一个全局变量吗?

假设我有一个带有全局变量的* .c文件(在它有文件范围的意义上是“全局”)和一个函数。 函数可以将该变量作为要在其他翻译单元中使用的值返回吗? 我认为答案是肯定的。 如果没有别的,我假设在C return中运行“copy”语义—返回表达式的值。 但我不确定。

var不会变成全局但仍然是本地的

从下面的代码片段开始,我尝试测试NewGlobalRef并尝试在if块的本地范围内声明它后使clsStr全局。 jstring Java_Package_LocalAndGlobalReference_returnGlobalReference (JNIEnv *env, jobject obj) { if(1) { printf(“In function make global reference\n”); jclass clsStr ; jclass cls = (*env)->FindClass(env,”java/lang/String”); if( cls == NULL) return NULL; // create a global reference of clsStr clsStr = (*env)->NewGlobalRef(env,cls); // Delete the local reference, which is no longer userful (*env)->DeleteLocalRef(env,cls); if(clsStr == NULL) return NULL; } […]

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吗?

关于clsStr变量的全局是什么,“clsStr =(* env) – > NewGlobalRef(env,cls)”?

JNI中的全局引用被认为是必须由程序员手动释放的引用。 它与c上下文无关。 所以像这样的代码: { jclass clsStr = (*env)->NewGlobalRef(env,cls); } return clsStr; 会给出一个错误,说clsStr是未定义/未声明的 。 我理解这一点。 但我不明白的是使用这些类型的参考。 在上面的代码中clsStr全局是什么? 此变量在将来或在调用返回后如何有用? 我还读到“基本上,全局引用对于确保它(及其内容)将存活到下一个JNI调用是有用的”但我不明白这一点。

MASM:从程序集访问全局C变量

我正在编写一个程序来转换图像并比较C和汇编中处理数据的速度。 我有3个项目: C的主要项目 C中的DLL转换图像 ASM中的DLL转换图像 在C DLL头文件中,我只是写道: #ifdef PROJEKTC_EXPORTS #define PROJEKTC_API __declspec(dllexport) #else #define PROJEKTC_API __declspec(dllimport) #endif … extern PROJEKTC_API unsigned int ThreadID; PROJEKTC_API void __cdecl funkcjaC(void* Args); 包含此标题后,我可以在主项目和C DLL中访问变量ThreadID。 当我尝试在ASM中执行相同操作时,问题就开始了。 我在extern ASMThreadID:dword块中尝试过像extern ASMThreadID:dword这样的构造,但它不起作用。 我得到的错误: error LNK2019: unresolved external symbol _ASMThreadID referenced in function _MyProc1 我觉得这是1-2行代码的问题,但我无法弄清楚应该使用哪条指令。 我通过ASM中的模块定义文件链接项目,并将ASM.lib文件添加到主项目的链接器 – >输入中。 你有什么建议吗?

如何将全局值从C传递给LUA?

最近我在我的C应用程序中嵌入了LUA,我现在要做的是我有一个值(Session_ID)我想从C函数传递给LUA脚本,以便LUA脚本可以使用它来调用一个函数回到C. 我在C中加载LUA脚本并运行它(使用lua_pcall)没有问题,我也没有问题从LUA内部调用C函数,我当前的问题是来回传递全局变量。 例如: 在C侧(test.c): session_id = 1; luabc_sz = rlen; result = lua_load(L, luaByteCodeReader, file, “script”, “bt”); if( lua_pcall(L, 0, 0, 0) != 0 ) 其中file是包含LUA脚本(script.lua)的数组。 在Lua side script.lua): print “Start” for i=1,10 do print(i, **session_id**) end print “End” “print”被我自己的函数覆盖,我想将session_id传递给它。 所以完整的场景是我在c函数中有session_id ,我想传递给LUA脚本,稍后将使用它来调用用C编写的print函数。 有任何帮助:)?

全局变量是否比C中的局部变量快?

我对此有几点想法。 第一个是分配全局变量可能更快,因为它们在程序首次生成时只分配一次,而每次调用函数时都必须分配局部变量。 我的第二个想法是,由于局部变量在堆栈上,它们是通过基址指针寄存器访问的,因此每次访问局部变量时,必须递减存储在基址指针中的值。 全局变量可以通过数据段中的静态地址直接访问。 我的想法准确吗?

如何避免在线程中使用全局变量

我编写了一个C程序,它使用两个线程进行读写。 我已经将两个线程都访问的变量声明为Global。 在这种情况下如何避免使用全局变量。

全球变量是否糟糕?

在C / C ++中,全局变量和我的教授认为的一样糟糕吗?

什么时候全局变量的初始化发生?

我知道程序运行时,首先执行main()函数。 但是什么时候在main()之外声明的全局变量的初始化发生了? 我的意思是如果我声明一个这样的变量: unsigned long current_time = millis(); void main() { while () { //some code using the current_time global variable } } 这里,全局变量初始化的确切时间很重要。 请告诉我在这种情况下会发生什么。