如果我在头文件中声明静态const变量,如下所示:
static const int my_variable = 1;
然后将此标题包含在多个.c
文件中,编译器会为每个文件创建新实例,或者是" smart"足以看到它是const
并且只为所有文件创建一个实例?
我知道我可以将其设置为extern并在包含此标题的.c
文件之一中定义它,但这是我不想做的事情。
答案 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)
我猜它只会为所有文件生成一个实例。但您可以通过在不同的文件中调用它并检查其值来验证它