Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何定义可以访问源文件中变量的宏?_C - Fatal编程技术网

C 如何定义可以访问源文件中变量的宏?

C 如何定义可以访问源文件中变量的宏?,c,C,我的程序需要一些字符转换数组,在char\u convert.c中: unsigned short gsm_to_ucs2[] = { '@', 0xa3, '$', 0xa5, 0xe8, 0xe9, 0xf9, 0xec, ...... }; 我想定义一个可以访问gsm\u到\u ucs2数组的宏: #define GSM2UCS(i) gsm_to_ucs2[i] 如果我在char\u convert.h中定义此宏,我还需要添加以下行: exter

我的程序需要一些字符转换数组,在
char\u convert.c
中:

unsigned short gsm_to_ucs2[] = {
     '@',   0xa3,  '$',   0xa5,  0xe8,  0xe9,  0xf9,  0xec,
     ......
};
我想定义一个可以访问
gsm\u到\u ucs2
数组的宏:

#define GSM2UCS(i) gsm_to_ucs2[i]
如果我在
char\u convert.h
中定义此宏,我还需要添加以下行:

extern unsigned short gsm_to_ucs2[];
否则,编译器将投诉
“'gsm\u to\u ucs2'未声明”


有没有更好的方法来定义可以访问源文件中变量的宏?

宏只是文本替换

如果从文本替换的角度来考虑某件事情是没有意义的,那么它作为一个宏也是没有意义的

你的问题就是这样。将
gsm\u写入头中的\u ucs2[i]
是没有意义的,因为该变量属于.c文件。因此,使用宏也没有意义


不要这样做。

宏只是文本替换

如果从文本替换的角度来考虑某件事情是没有意义的,那么它作为一个宏也是没有意义的

你的问题就是这样。将
gsm\u写入头中的\u ucs2[i]
是没有意义的,因为该变量属于.c文件。因此,使用宏也没有意义


不要这样做。

您可以使用复合文字来代替变量

#define GSM_TO_UCS2                                         \
(unsigned short const[]){                                   \
     '@',   0xa3,  '$',   0xa5,  0xe8,  0xe9,  0xf9,  0xec, \
     ......                                                 \
}
然后在
GSM\u TO\u UCS2[45]
中使用它

观察类型中的
const
,对于变量示例,您可能也遗漏了这一点。如果索引是常量,这对于允许编译器优化数组非常重要


自C99以来,复合文字在C语言中可用。如果没有,可以将变量声明为
static
,并在头文件中公开定义(使用
const
类型)

您可以使用复合文字来代替变量

#define GSM_TO_UCS2                                         \
(unsigned short const[]){                                   \
     '@',   0xa3,  '$',   0xa5,  0xe8,  0xe9,  0xf9,  0xec, \
     ......                                                 \
}
然后在
GSM\u TO\u UCS2[45]
中使用它

观察类型中的
const
,对于变量示例,您可能也遗漏了这一点。如果索引是常量,这对于允许编译器优化数组非常重要


自C99以来,复合文字在C语言中可用。如果没有,可以将变量声明为
static
,并在头文件中公开定义(使用
const
类型)

这确实很难看,但您可以使用宏的标记粘贴操作符从宏库中为每种情况进行选择


这真的很难看,但是您可以使用宏的标记粘贴操作符为每种情况从宏库中进行选择


为什么要使用宏,简单地编写变量本身有什么错?我想定义一个可以将一个字符集转换为另一个字符集的宏,以便其他源文件可以使用它。C源代码不能访问不同的翻译单元,除非用
extern
关键字显式指定。在这种情况下,除非使用
extern
#include
明确指定,否则宏无法访问不同的源文件。使用
extern
公开变量,或者使用函数而不是宏(在数组要显示的文件中实现)。为什么要使用宏,简单地编写变量本身有什么错?我想定义一个可以将一个字符集转换为另一个字符集的宏,因此其他源文件可以使用它。C源代码不能访问不同的翻译单元,除非用
extern
关键字显式指定。在这种情况下,除非使用
extern
#include
明确指定,否则宏无法访问不同的源文件。使用
extern
公开变量,或者使用函数代替宏(在数组要可见的文件中实现)。:“您可以将变量声明为静态变量,并在头文件中公开定义(使用常量类型)。”。你能举个例子吗?我不是很清楚。@NanXiao
静态无符号short
。静态全局变量(和函数)是翻译单元的局部变量,在链接阶段单元之间不会发生冲突。没有它,您将得到“多个定义”-种类错误:“您可以将变量声明为静态,并在头文件中公开定义(使用const类型)。”。你能举个例子吗?我不是很清楚。@NanXiao
静态无符号short
。静态全局变量(和函数)是翻译单元的局部变量,在链接阶段单元之间不会发生冲突。如果没有它,您将得到“多个定义”——一种错误。