假设我有这三个文件:
啊
//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
我想知道为什么你不能在2个不同的.cpp文件中声明一个具有相同名称的全局.我的理解是考虑范围,它应该只对特定的.cpp文件可见,而不是其他地方,但它显然是在抱怨.我这样做的原因是代码中的通用性,就是这样.有任何想法吗?
编辑清晰度
a.cpp
int g_x;
b.cpp
int g_x;
这可能是一个愚蠢的问题,但也许有人可以提供一些见解.
我在头文件中定义了一些全局变量(是的,我知道这很糟糕,但这只是一种假设情况).我将此头文件包含在两个源文件中,然后将这些文件编译为两个目标文件.全局符号不会在代码中的任何位置引用.
如果源文件是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)