【发布时间】:2013-12-17 06:41:12
【问题描述】:
我有一个问题。在我自己的网络服务器中,我在文件范围内有以下代码:
typedef struct {
char *slice;
int length;
} values_index;
const char *aHeaderKeys[] = {
/* You can add here whatever you want! */
"Accept",
"Accept-Charset",
"Accept-Encoding",
"Accept-Language",
"Authorization",
"Expect",
"From",
"Host",
"If-Match",
"If-Modified-Since",
"If-None-Match",
"If-Range",
"If-Unmodified-Since",
"Max-Forwards",
"Proxy-Authorization",
"Range",
"Referer",
"TE",
"User-Agent",
"Connection"
};
int nHeadersSizes[sizeof(aHeaderKeys) / sizeof(*aHeaderKeys)];
values_index aHeaderValuesIndexes[sizeof(aHeaderKeys) / sizeof(*aHeaderKeys)];
const int nHeadersLen = sizeof(aHeaderKeys) / sizeof(*aHeaderKeys);
但是,由于aHeaderKeys是一个由常量字符串组成的定长数组,所以在程序执行过程中计算数组的长度是很愚蠢的,最好还是手动写:
typedef struct {
char *slice;
int length;
} values_index;
const char *aHeaderKeys[20] = {
/* You can add here whatever you want! */
"Accept",
"Accept-Charset",
"Accept-Encoding",
"Accept-Language",
"Authorization",
"Expect",
"From",
"Host",
"If-Match",
"If-Modified-Since",
"If-None-Match",
"If-Range",
"If-Unmodified-Since",
"Max-Forwards",
"Proxy-Authorization",
"Range",
"Referer",
"TE",
"User-Agent",
"Connection"
};
int nHeadersSizes[20];
values_index aHeaderValuesIndexes[20];
const int nHeadersLen = 20;
但是我的数组元素的数量在开发过程中可能会发生变化,所以每次我想添加另一个元素时,我都必须在各处手动更改长度。 现在我的问题是:是否可以编写一个预处理器宏,类似于我用 JavaScript 编写的以下宏(作为伪代码)?
var aHeaders = [
"Accept",
"Accept-Charset",
"Accept-Encoding",
"Accept-Language",
"Authorization",
"Expect",
"From",
"Host",
"If-Match",
"If-Modified-Since",
"If-None-Match",
"If-Range",
"If-Unmodified-Since",
"Max-Forwards",
"Proxy-Authorization",
"Range",
"Referer",
"TE",
"User-Agent",
"Connection"
];
var sExplodedText = "const char *aHeaderKeys[" + aHeaders.length + "] = {\n\t\/* You can add here whatever you want! *\/\n\t\"" + aHeaders.join("\",\n\t\"") + "\"\n};\n\nint nHeadersSizes[" + aHeaders.length + "];\nvalues_index aHeaderValuesIndexes[" + aHeaders.length + "];\nconst int nHeadersLen = " + aHeaders.length + ";";
alert(sExplodedText);
【问题讨论】:
-
编译器无论如何都会在编译时评估 sizeofs,所以没有必要这样做。
标签: c arrays c-preprocessor static-array