我在一个项目(Visual Studio)中有3个*.c文件(file1.c,file2.c和file3.c)和1个*.h文件(file3.h).
/*******************************
file3.h
********************************/
#ifndef FILE3_H
#define FILE3_H
int gintVariable = 400;
#endif
Run Code Online (Sandbox Code Playgroud)
/*******************************
file1.c
********************************/
#include "file3.h"
#include <stdio.h>
#include <conio.h>
int modifyGlobalVariable(void);
void printGlobalVariable(void);
int main(void)
{
modifyGlobalVariable();
printGlobalVariable();
printf("Global variable: %d\n", gintVariable++);
getch();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
/*******************************
file2.c
********************************/
#include "file3.h"
int modifyGlobalVariable(void)
{
return gintVariable++;
}
Run Code Online (Sandbox Code Playgroud)
/*******************************
file3.c
********************************/
#include "file3.h"
#include <stdio.h>
void printGlobalVariable(void)
{
printf("Global: %d\n", gintVariable++);
}
Run Code Online (Sandbox Code Playgroud)
当我在VS中构建解决方案时,它会给出错误"_gintVariable already …
我实现了一个自定义内存分配器。这个内部文件的所有主要代码memory.c我都在这个文件中创建了一个主函数来测试函数。一切正常。但是当我将这些测试代码移动到另一个文件(调用main.c并运行它)时,我遇到了分段错误。
int main (int argc, char *argv []) {
allocator_init();
char* ptr = (char*) allocate(4096); // csutom function. that on `memory.c`
strcpy(ptr, "this is the test one");// segmentation fault here
printf("print: %s\n", ptr);
deallocate(ptr);
}
Run Code Online (Sandbox Code Playgroud)
这是主要代码:
volatile Memory memory;
/* allocated memory to memory variable by assign /dev/zero to memory */
void allocator_init() {
fd = open("/dev/zero", O_RDWR);
if(fd == -1) {
perror("File open failed");
exit(0);
}
// page size can different on different platform. customize …Run Code Online (Sandbox Code Playgroud) 假设以下代码:
AC:
#include <stdio.h>
int a;
int func();
int main(int argc, char **argv) {
a = 7;
int a2 = func();
printf("a is %d, a2 is %d\n", a, a2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
和bc:
int a;
int func()
{
a = 9;
return a;
}
Run Code Online (Sandbox Code Playgroud)
使用g++ a.c b.c -Wall -O0它编译时会产生链接错误,如预期的那样.但是,调用gcc a.c b.c -Wall -O0它时不会产生警告而且没有错误!
输出a is 9, a2 is 9顺便说一下.
gcc版本5.4.0 20160609(Ubuntu 5.4.0-6ubuntu1~16.04.4)
GCC为什么允许这样做?我对这种行为感到惊讶.如果在声明时初始化变量,那么链接也将失败并使用GCC.
我C下面有 2 个文件。从我读到的我知道全局变量的默认存储类是 extern。如果我明确输入它,我会收到未定义的变量错误。我在这里缺少什么?这是否意味着当我省略 extern 关键字时它成为一个定义,但当我输入它时它只是一个声明?
文件1.c
#include <stdio.h>
#include <stdlib.h>
extern void file2function();
int variable; // if i put extern i will get error, isnt it implicitly extern?
int main()
{
variable = 1;
printf("file1 %d\n",variable);
file2function();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
文件2.c
#include <stdio.h>
#include <stdlib.h>
extern int variable;
void file2function(){
variable = 2;
printf("file2 %d\n",variable);
return;
}
Run Code Online (Sandbox Code Playgroud) 在 C 中,默认情况下,变量和函数都在文件范围内具有外部链接。为什么extern仅变量需要关键字,而其他地方定义的函数不需要关键字?请注意,这个问题有两个方面。鉴于文件范围内的声明默认为外部链接:
extern或没有的区别?或者说,为什么客观上不需要这样的区分?extern?或者说,客观上为什么需要这样的区分?作为一个最小的示例,让我们使用以下两个源文件(tu代表“翻译单元”)。
tu1.c:
extern int i = 123;
Run Code Online (Sandbox Code Playgroud)
tu2.c:
#include <stdio.h>
extern int i;
int main(void) {
//extern int i;
++i;
printf("%d\n", i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我们可以用 GCC 编译它们,如下所示:
gcc -c tu1.c
gcc -c tu2.c
gcc -o myprogram tu1.o tu2.o
Run Code Online (Sandbox Code Playgroud)
'i' initialized and declared 'extern'(GCC对第一个命令发出警告,因为它错误地认为extern“应该保留用于非定义声明”。我们可以安全地忽略它。)
让我们比较一下编译器对于略有不同的源代码版本的行为:
extern int i;在文件范围内tu2.c(对上述代码没有更改):ismyprogram124extern int i;in main …假设我使用变量声明头文件:
int count;
Run Code Online (Sandbox Code Playgroud)
然后在源文件中,我想使用count.我必须声明为:
extern int count
Run Code Online (Sandbox Code Playgroud)
或者我可以在我的源文件中使用它吗?所有假设我都有#include "someheader.h".或者我应该在源文件中声明它?放入count头文件和源文件有什么区别?或者没关系?
我必须在代码中定义一个大型数组(查找表).它包含256个元素,占用近1个电脑屏幕.
有两个函数正在使用此数组.我想在函数下定义这个数组,所以我可以在开发过程中非常快速地访问它们.
但是如果我尝试在一个文件中执行它,编译器将在函数周围给出"未声明的标识符"错误 - 因为它们使用数组.
所以,我必须将函数和数组放在单独的文件中.
这是我的程序的结构:
main.cpp:
#include "lookup.h"
...uses two functions...
Run Code Online (Sandbox Code Playgroud)
-
lookup.h:
#ifndef SubMaster_lookup_h
#define SubMaster_lookup_h
void func1(void);
void func2(void);
char LookupTable[][3]={ "00", "01", "02" "03", "04", "05", "06", "07", "08", "09",
"0a", "0b", "0c", "0d", "0e", "0f", "00", "01", "02" "03", "04", "05", "06", "07",
"08", "09", "0a", "0b", "0c", "0d", "0e", "0f", "10", "11", "12", "13", and so on...}
Run Code Online (Sandbox Code Playgroud)
-
lookup.cpp:
#include "lookup.h"
void func1() {
...body of func1...
}
void func2() {
...body of …Run Code Online (Sandbox Code Playgroud) 我试图了解在多个文件(编译单元)之间共享 C 全局变量的方式。我读过优秀的问题和答案在这里。然而,在做了一些测试之后,我仍然有一些我没有得到的东西:
基本上我的问题是:如果在没有extern关键字的头文件中声明(但未定义)一个变量,是否可以简单地将该头文件包含在各种编译单元中,以便使该变量可用于所有这些编译单元?在这种情况下,这意味着一个(并且只有一个)编译单元包含用于初始化(定义?)该变量的代码,并且在其他编译单元尝试对该变量执行任何操作之前,它将首先被调用。如果这一切都是真的,那么这个过程是否称为“隐式外部”?
我将用一个例子来说明我的问题:
标题“MyCommonHeader.h”包含:
//MyCommonHeader.h
int* i; //pointer to an int
Run Code Online (Sandbox Code Playgroud)
文件 MyFirstHeader.h 包含:
//MyFirstHeader.h
void changeIt(int newValue);
Run Code Online (Sandbox Code Playgroud)
文件 MyFirstSource.c 包含:
//MyFirstSource.c
#include "MyFirstHeader.h"
void changeIt(int newValue) {
*i = newValue;
}
Run Code Online (Sandbox Code Playgroud)
文件 MySecondSource.c 包含:
//MySecondSource.c
#include "MyCommonHeader.h"
#include "MyFirstHeader.h"
void main() {
i = malloc(sizeof(int));
changeIt(10);
*i = 23;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码是否到处都使用相同的 i 变量?我需要在extern任何地方添加吗?
我想知道子类是否可以从main.cpp文件中访问变量.例如:
Main.ccp
int x = 10;
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
示例类的cpp
Subclass::Subclass ()
{
x = 5;
}
Run Code Online (Sandbox Code Playgroud)
错误:
error: 'x' was not declared in this scope
Run Code Online (Sandbox Code Playgroud)
我是编码的新手,我想知道这是否可行,如果没有,我怎么能这样做?
如果我想将值修改为一个函数并将其带回主函数,哪个更好?并说用C引用传递,是指使用指针,如本例所示。我应该将“ a”作为全局变量吗?
#include <stdio.h>
#include <conio.h>
int sum;
int example(int *a,int b)
{
sum = *a + b;
(*a)++;
}
int main(void)
{
int a, b;
printf("Tell me the value of A and B: \n");
scanf("%d %d", &a, &b);
example(&a, b);
printf("The result: %d . And the new value of A: %d", sum, a);
printf("\n\nTHE END\n");
getch();
return 0;
}
Run Code Online (Sandbox Code Playgroud)