我可以在头文件中获取 static 关键字的示例吗?
Can I get examples for static keyword in header file?
static.h
static int y = 20;
static int& f(){
static int x = 0;
return x;
}
general.h
int x = 10;
int& g(){
static int x = 0;
return x;
}
outer.h
#include"general.h"
#include"static.h"
void h(){
x = 20;//static
y = 20;//non static
f() = 20;//static
g() = 20;//non static
}
main.cpp
#include<iostream>
#include"static.h"
#include"general.h"
#include"outer.h"
int main(){
h();
std::cout<<"static objects are independent in each file\n";
std::cout<<"x : "<<x<<", f() : "<<f()<<std::endl;
std::cout<<"non static objects are only one in every file.\n ";
std::cout<<"y : "<<y<<", g() : "<<g()<<std::endl;
}
我想模拟 static 关键字如何改变代码行为。
但是,我不知道该怎么做...
我该怎么办?
................................................ .........
我拆分了我的代码。
static.h
static int x = 0;
static int& f(){
static int k = 0;
return k;
}
void call_static();
static.cpp
#include"static.h"
void call_static(){
x = 10;
f() = 10;
}
general.h
int y = 0;
int& g(){
static int z = 0;
return z;
}
void call_general();
general.cpp
#include"general.h"
void call_general(){
y = 10;
g() = 10;
}
静态代码编译的很好,但是非静态代码没有编译。
错误代码
/usr/bin/ld: /tmp/general-539e11.o: in function `g()':
general.cpp:(.text+0x0): multiple definition of `g()'; /tmp/main-5f12cd.o:main.cpp:(.text+0x0): first defined here
/usr/bin/ld: /tmp/general-539e11.o:(.bss+0x0): multiple definition of `y'; /tmp/main-5f12cd.o:(.bss+0x4): first defined here
clang-12: error: linker command failed with exit code 1 (use -v to see invocation)
正常吗?
在您展示的示例中,只有一个 .cpp
文件。
.h
个文件实际上不算作“翻译单元”,只有 .c
和 .cpp
个文件是翻译单元。
原因是 .h
文件被添加到使用 #include
.
的程序中
#include
将指定文件直接复制粘贴到当前文件中,使其成为 1 个大文件。
如果您有多个 .c
或 .cpp
文件(或两者的混合,也没关系),您将能够看到 static
关键字对 variable/function 可见度。
切记永远不要 #include
.c
或 .cpp
文件!
相反,您应该将它们单独添加到您的程序中。
如果您使用的是 Visual Studio(不是 VS Code),只需添加一个新的源文件即可自动将其添加到程序中,您无需在任何地方提及它。
如果您使用的是其他编译器,请将 .c
或 .cpp
文件的名称添加到要编译的文件列表中。
我建议阅读有关翻译单位的内容。
您可以在 https://en.wikipedia.org/wiki/Translation_unit_(programming) and What is a "translation unit" in C++? 上执行此操作,但我也强烈建议您仅在 google 上查找“c 和 c++ 翻译单元”并大致了解它们。
祝您编码愉快!
static.h
static int y = 20;
static int& f(){
static int x = 0;
return x;
}
general.h
int x = 10;
int& g(){
static int x = 0;
return x;
}
outer.h
#include"general.h"
#include"static.h"
void h(){
x = 20;//static
y = 20;//non static
f() = 20;//static
g() = 20;//non static
}
main.cpp
#include<iostream>
#include"static.h"
#include"general.h"
#include"outer.h"
int main(){
h();
std::cout<<"static objects are independent in each file\n";
std::cout<<"x : "<<x<<", f() : "<<f()<<std::endl;
std::cout<<"non static objects are only one in every file.\n ";
std::cout<<"y : "<<y<<", g() : "<<g()<<std::endl;
}
我想模拟 static 关键字如何改变代码行为。
但是,我不知道该怎么做...
我该怎么办?
................................................ .........
我拆分了我的代码。
static.h
static int x = 0;
static int& f(){
static int k = 0;
return k;
}
void call_static();
static.cpp
#include"static.h"
void call_static(){
x = 10;
f() = 10;
}
general.h
int y = 0;
int& g(){
static int z = 0;
return z;
}
void call_general();
general.cpp
#include"general.h"
void call_general(){
y = 10;
g() = 10;
}
静态代码编译的很好,但是非静态代码没有编译。
错误代码
/usr/bin/ld: /tmp/general-539e11.o: in function `g()':
general.cpp:(.text+0x0): multiple definition of `g()'; /tmp/main-5f12cd.o:main.cpp:(.text+0x0): first defined here
/usr/bin/ld: /tmp/general-539e11.o:(.bss+0x0): multiple definition of `y'; /tmp/main-5f12cd.o:(.bss+0x4): first defined here
clang-12: error: linker command failed with exit code 1 (use -v to see invocation)
正常吗?
在您展示的示例中,只有一个 .cpp
文件。
.h
个文件实际上不算作“翻译单元”,只有 .c
和 .cpp
个文件是翻译单元。
原因是 .h
文件被添加到使用 #include
.
的程序中
#include
将指定文件直接复制粘贴到当前文件中,使其成为 1 个大文件。
如果您有多个 .c
或 .cpp
文件(或两者的混合,也没关系),您将能够看到 static
关键字对 variable/function 可见度。
切记永远不要 #include
.c
或 .cpp
文件!
相反,您应该将它们单独添加到您的程序中。
如果您使用的是 Visual Studio(不是 VS Code),只需添加一个新的源文件即可自动将其添加到程序中,您无需在任何地方提及它。
如果您使用的是其他编译器,请将 .c
或 .cpp
文件的名称添加到要编译的文件列表中。
我建议阅读有关翻译单位的内容。
您可以在 https://en.wikipedia.org/wiki/Translation_unit_(programming) and What is a "translation unit" in C++? 上执行此操作,但我也强烈建议您仅在 google 上查找“c 和 c++ 翻译单元”并大致了解它们。
祝您编码愉快!