相关疑难解决方法(0)

在C++中编译全局变量的重新声明错误,但不在C中编译

假设我有这三个文件:

//a.h header
#include <stdio.h>
int int_variable;

void a_f()
{
   printf("int_variable: %d\n", int_variable)
   int_variable++;
}
Run Code Online (Sandbox Code Playgroud)

BH

//b.h header
#include <stdio.h>
int int_variable;

void b_f()
{
   printf("int_variable: %d\n", int_variable)
   int_variable++;
}
Run Code Online (Sandbox Code Playgroud)

main.c中

//main.c
#include "a.h"
#include "b.h"

int main()
{
   a_f();
   b_f();
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么在C++中编译会产生重定义错误,但在C中却没有?我是C++开发人员,然后在C++中对我有意义,但为什么在C中这不是错误?

当我执行C生成的代码时,输​​出是:

int变量:0

int变量:1

c c++ compiler-errors compilation global-variables

9
推荐指数
1
解决办法
3456
查看次数

C/C++ Scope在两个不同的.cpp文件中

我想知道为什么你不能在2个不同的.cpp文件中声明一个具有相同名称的全局.我的理解是考虑范围,它应该只对特定的.cpp文件可见,而不是其他地方,但它显然是在抱怨.我这样做的原因是代码中的通用性,就是这样.有任何想法吗?

编辑清晰度

a.cpp

int g_x;

b.cpp

int g_x;

c c++

5
推荐指数
2
解决办法
3010
查看次数

在C vs C++中由编译器在目标文件中包含未使用的符号

这可能是一个愚蠢的问题,但也许有人可以提供一些见解.

我在头文件中定义了一些全局变量(是的,我知道这很糟糕,但这只是一种假设情况).我将此头文件包含在两个源文件中,然后将这些文件编译为两个目标文件.全局符号不会在代码中的任何位置引用.

如果源文件是C,那么看起来编译器省略了全局符号,并且所有链接都没有错误.如果源文件是C++,则符号包含在两个目标文件中,然后我会收到链接器错误.对于C++,当我包含标题时,我使用extern"C".

我正在使用VS2005的Microsoft编译器.

这是我的代码:

头文件(test.h):

#ifndef __TEST_H
#define __TEST_H

/* declaration in header file */
void *ptr;

#endif
Run Code Online (Sandbox Code Playgroud)

C源文件:

test1.c

#include "test.h"

int main( ) {
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

test2.c中

#include "test.h"
Run Code Online (Sandbox Code Playgroud)

C++源文件:

test1.cpp

extern "C" {
#include "test.h"
}

int main( ) {
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

测试2.cpp

extern "C" {
#include "test.h"
}
Run Code Online (Sandbox Code Playgroud)

对于C,目标文件看起来像这样:

Dump of file test1.obj

File Type: COFF OBJECT

COFF SYMBOL TABLE
000 006DC627 ABS    notype       Static       | @comp.id
001 00000001 ABS    notype       Static       | …
Run Code Online (Sandbox Code Playgroud)

c c++ compilation

2
推荐指数
1
解决办法
1575
查看次数

标签 统计

c ×3

c++ ×3

compilation ×2

compiler-errors ×1

global-variables ×1