在我解释我的问题之前,请注意我已经看到我在公司工作的代码中发生了以下现象,因此我无法共享实际代码,而是会提供一些伪C代码片段解释我的问题。
让我们说file1.h包含以下代码行:
#ifndef FILE1_H
#define FILE1_H
struct data {
int a;
};
struct data foo;
void run(void);
#endif
现在我以下列方式将此标题包含在另一个文件中:
#include "file1.h"
void run() {
int count = 0;
while(1) {
foo.a = count;
count = (count + 1) % 500;
}
}
现在在主文件中,我创建一个指向run()
方法的线程,并创建一个以这种方式从data.foo
读取的循环 - :
#include <unistd.h>
#include <stdio.h>
#include <pthread.h>
#include "file1.h"
void main(void) {
pthread_create(&id, NULL, run, NULL);
while(1) {
printf("Data = %d\n",foo.a);
sleep(1);
}
}
在正常情况下,这应该给编译器错误,即存在多个相同结构变量的声明。我还尝试制作这样的小样本程序 - 它们都在编译时失败,就像他们应该。
但我实际上看到过这样的代码并且工作得很好。
在一个文件中,我有我写入数据的变量,而在另一个文件中,我只是从中读取数据。
C编译器是否允许这样的情况? GCC中的任何编译器标志?我通常使用Makefile构建,所以任何模糊的编译器标志或开关都允许这种行为?
或者我对C的理解是否有所失效?
请原谅我的代码中的其他编译时错误,因为这是伪代码来解释我的问题。