相关疑难解决方法(0)

Include Guard仍然插入全局变量

我在一个项目(Visual Studio)中有3个*.c文件(file1.c,file2.cfile3.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 …

c global-variables include-guards

4
推荐指数
1
解决办法
533
查看次数

C : 将主函数移动到新文件时出现分段错误

我实现了一个自定义内存分配器。这个内部文件的所有主要代码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)

c segmentation-fault

4
推荐指数
1
解决办法
759
查看次数

GCC多次声明全局变量时没有警告或错误

假设以下代码:

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 gcc

4
推荐指数
1
解决办法
526
查看次数

C - 为全局变量显式编写 extern 关键字

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 declaration access-specifier extern

4
推荐指数
1
解决办法
791
查看次数

为什么变量需要 extern 而函数不需要 extern?

在 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(对上述代码没有更改):is
    的输出,如预期的那样。myprogram124
  • extern int i;in main …

c language-design extern

4
推荐指数
1
解决办法
451
查看次数

将变量放入标题与将变量放入源中的区别

假设我使用变量声明头文件:

int count;
Run Code Online (Sandbox Code Playgroud)

然后在源文件中,我想使用count.我必须声明为:

extern int count
Run Code Online (Sandbox Code Playgroud)

或者我可以在我的源文件中使用它吗?所有假设我都有#include "someheader.h".或者我应该在源文件中声明它?放入count头文件和源文件有什么区别?或者没关系?

c header extern

3
推荐指数
1
解决办法
4499
查看次数

定义一个非常大的数组(查找表)的最佳方法是什么?

我必须在代码中定义一个大型数组(查找表).它包含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++ arrays

3
推荐指数
1
解决办法
4116
查看次数

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

我试图了解在多个文件(编译单元)之间共享 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任何地方添加吗?

c global-variables extern

3
推荐指数
1
解决办法
1924
查看次数

C++子类访问主类变量

我想知道子类是否可以从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++ class

3
推荐指数
1
解决办法
1803
查看次数

通过引用传递或在C中使用全局变量

如果我想将值修改为一个函数并将其带回主函数,哪个更好?并说用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)

c pointers pass-by-reference

3
推荐指数
1
解决办法
4196
查看次数