我有一些冗长的时间与C++之后回头(嵌入)C,并有以下问题最优雅的方式,让我们称之为utilities.h
和utilities.c
在这里面,我有一个重要的阵列,我们称之为分享C数组
#define IMPORTANT_ARRAY_LENGTH 10000
char important_array[IMPORTANT_ARRAY_LENGTH];
我有很多的其他功能这个utilities
模块中,他们都做工精细。然而,在其他源文件中的一个,我们称之为worker.c
,我不得不使用这个数组。什么是“官方”的,优雅的方式来做到这一点,而不必把extern char important_array[IMPORTANT_ARRAY_LENGTH]
,并在worker.c
宏定义?
如果我做到以下几点:
utilities.h
#ifndef _UTILITIES_H_
#define _UTILITIES_H_
#define IMPORTANT_ARRAY_LENGTH 10000
extern char important_array[IMPORTANT_ARRAY_LENGTH];
// ...
utilities.c
#ifndef _UTILITIES_C_
#define _UTILITIES_C_
#include "utilities.h"
char important_array[IMPORTANT_ARRAY_LENGTH];
// ...
worker.c
#include "utilities.h"
// ...
important_array[0] = 0;
那么我的阵列将是一个未定义的符号在worker.c
。如果我不utilities.h
使用extern
关键字,那么当然,这是一个重复的符号。 (奇怪的是,它只编译了一个警告,我可以从链接文件中看到大小被分配多次。)
我真的必须在worker.c
中声明我的数组吗?我想保持一切都干净,并且只将所有声明放在一个地方:在一个头文件中。我想有宏定义只有一次(这是次要的,因为我可以用一个常量,但我想预处理器来处理它,而不是占用的地方)
在'utilities.h'声明它。如果编译器抱怨“未定义符号”,那么你有另一个问题。你如何编译它? – asaelr 2012-02-22 12:59:27
我确实在'utilities.h'中声明了它。我的问题是关于'worker.c'。 – vsz 2012-02-22 13:23:17
顺便说一句:不要在预处理符号中使用前导下划线,除非你是实现的一部分。 – wildplasser 2012-02-22 13:28:40