C 定义一个在范围外使用的变量

C 定义一个在范围外使用的变量,c,C,我试图通过修改一段代码来提供帮助,但我担心我犯了“定义变量时,只能在定义的范围内使用它”的错误 试图通过文本字符串实现语言更改,而不是复制代码。所以我想从字面上说 if (language == 0) { static const XCHAR text1[] = ("HELLO"); } else { static const XCHAR text1[] = ("BONJOUR"); } 然后才能在代码中使用 StCreate ( ID_ST31, 20, 82, 780, 500,

我试图通过修改一段代码来提供帮助,但我担心我犯了“定义变量时,只能在定义的范围内使用它”的错误

试图通过文本字符串实现语言更改,而不是复制代码。所以我想从字面上说

if (language == 0)
{
static const XCHAR text1[] = ("HELLO");
} else {
static const XCHAR text1[] = ("BONJOUR");
}
然后才能在代码中使用

StCreate
(
ID_ST31,
 20,
 82,
 780,
 500,
 ST_DRAW,
 text1,
 alt3Scheme
);

根据我在这里读到的内容,上面的代码将只初始化{}中的文本字段?是否需要在外部将变量设置为NULL?请告诉我缺少一些明显的内容。

您需要知道是否确实希望声明是静态的。如果项目只有一个文件,则可以将该文件中的所有内容声明为静态,但如果希望文件之间的可见性,则不能将变量声明为静态并使其已知,否则其他文件将无法看到该变量

您可以使用带有三元运算符的指针:

const char* text1 = (language == 0) ? "HELLO" : "BONJOUR";
通常,此类问题通过指针解决,如下所示:

const struct my_struct* actual_data;
if (cond) {
    static const struct my_struct data = {...};
    actual_data = data;
} else {
    static const struct my_struct data = {...};
    actual_data = data;
}
但就我个人而言,如果您不需要修改数组,那么在这种简单的情况下使用字符串数组没有任何意义

是否需要在外部将变量设置为NULL

这不是必要的,但通常被认为是良好的做法

对于您的特殊情况,有一种非常简单且相对可扩展的方法来实现本地化-使用阵列:

static const char* const text1[LANGUAGE_COUNT] = {
    "HELLO",
    "BONJOUR",
    "ПРИВЕТ",
    ...
};
你基本上想要这个:

static const XCHAR *text1_ENG = "HELLO";
static const XCHAR *text1_FRA = "BONJOUR";

char *GetText1()
{
   if (language == 0)
     return text1_ENG;
   else
     return text1_FRA;
}
...
StCreate
(
ID_ST31,
 20,
 82,
 780,
 500,
 ST_DRAW,
 GetText1(),
 alt3Scheme
);

但这方面仍有很大的改进空间。您的程序中可能有多个文本,您也可能有两种以上的语言。

是的,但有一个
静态
,具有重要意义,不是吗?您想做什么?为什么不从一开始就正确地执行这些操作呢?为什么它不能只是一个指向在更高范围内定义并由分支初始化的
const char
指针的指针呢?常量数组给了你什么?这最终会成为维护的噩梦。使用全局数组和访问函数从索引(参数)/语言(变量)返回字符串。这不会提供答案,它属于OP的注释。