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
。静态全局变量(和函数)是翻译单元的局部变量,在链接阶段单元之间不会发生冲突。如果没有它,您将得到“多个定义”——一种错误。