头文件中的静态const变量声明

时间:2016-08-12 07:18:17

标签: c compilation header-files

如果我在头文件中声明静态const变量,如下所示:

static const int my_variable = 1;

然后将此标题包含在多个.c文件中,编译器会为每个文件创建新实例,或者是" smart"足以看到它是const并且只为所有文件创建一个实例?

我知道我可以将其设置为extern并在包含此标题的.c文件之一中定义它,但这是我不想做的事情。

3 个答案:

答案 0 :(得分:12)

我详细回答了here。这个答案适用于C ++,但它也适用于C语言。

翻译单元是单独的源文件。每个包含标题的翻译单元都会“看到”// Load type name from json - you'll need to implement LoadTypeFromJson() method to load type name string from json string typeName = LoadTypeFromJson(); // Get .Net Type by type name Type entityType = Type.GetTypeByName(typeName); // Get Serializer type Type serializerType = typeof(Serializer); // Get MethodInfo for Deserialize method of Serializer class MethodInfo deserializeMethodInfo = serializerType.GetMethod("Deserialize"); // Construct Serializer.Deserialize<IEntity> method for specific IEntity MethodInfo constructedDeserializeMethod = deserializeMethodInfo.MakeGenericMethod(entityType); // Call constructed method constructedDeserializeMethod.Invoke(null, new object[] { jsonString }); 。在此上下文中,static const int表示static的范围仅限于翻译单元。因此,您最终会为每个翻译单元(“my_variable文件”)提供单独的 my_variable

编译器不会“智能”为所有文件只创建一个实例,它将错误,因为显式告诉它不要这样做({ {1}})。

答案 1 :(得分:3)

如果您使用该对象的地址 - 编译器肯定会为每个翻译单元创建一个实例。如果你只使用价值 - 它可能足够聪明,可以避免创建对象 - 价值将在需要的地方内联。

答案 2 :(得分:-2)

我猜它只会为所有文件生成一个实例。但您可以通过在不同的文件中调用它并检查其值来验证它