我有一些冗長的時間與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