XCode 12.5.1初始化timezone报编译错误的简单解决方案是什么
问题根因
旧版OS X 10.6的SDK中timezone被定义为编译期可确定地址的宏,支持直接作为全局变量的初始值。而新版Xcode 12.5+对应的macOS SDK修改了timezone的定义,改为运行时才会重定位的全局变量,不符合C语言标准中「全局变量的初始化值必须是编译期常量」的要求,因此抛出错误:
Initializer element is not a compile-time constant
简单修复方案
以下方案改动量都极小,无需修改原有业务逻辑中对pFunc的调用:
- 方案1:编译器构造函数自动初始化(推荐,改动最小)
用Clang支持的constructor属性标记初始化函数,程序会在main执行前自动完成全局变量赋值,原有代码逻辑完全不需要调整:
#include <time.h> // 原有声明去掉初始化 void *pFunc; // 新增这段初始化逻辑即可 __attribute__((constructor)) static void init_global_pfunc() { pFunc = timezone; } int main() { // 原有main逻辑完全不变 return 0; }
该属性是Clang、GCC的通用扩展,在Apple全平台都稳定可用。
- 方案2:标准C手动初始化(无编译器依赖)
先把全局变量初始化为NULL,在main函数最开头完成赋值即可:
#include <time.h> void *pFunc = NULL; int main() { // 第一行先完成赋值 pFunc = timezone; // 原有main逻辑放在赋值之后 return 0; }
这个方案完全符合C标准,没有任何平台特定的语法。
内容的提问来源于stack exchange,提问作者Radu C
相关产品推荐
相关产品推荐

