c - 在文件之间共享结构的奇怪方式

时间:2018-04-11 15:29:59

标签: c gcc header-files

在我解释我的问题之前,请注意我已经看到我在公司工作的代码中发生了以下现象,因此我无法共享实际代码,而是会提供一些伪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的理解是否有所失效?

请原谅我的代码中的其他编译时错误,因为这是伪代码来解释我的问题。

0 个答案:

没有答案