【c/c++】c和cpp混合编译
c和cpp混合编译
#ifdef __cplusplus
extern "C" {
#endifextern int test(int, int);#ifdef __cplusplus
}
#endif
在这段代码中,#ifdef __cplusplus 和 #endif 之间的代码是为了在 C++ 中使用 C 语言的函数声明和定义时,确保编译器正确地处理 C 和 C++ 之间的语法差异。这是因为 C 和 C++ 有一些不同之处,包括函数名的重载、类型转换等。
在这段代码中,extern “C” 是一个 C++ 的特性,它告诉编译器要按照 C 的方式来处理其中的函数。具体来说:
#ifdef __cplusplus:这个条件编译指令检查是否正在编译 C++ 代码。__cplusplus 是一个宏,当编译器编译 C++ 代码时,它会被定义。因此,如果代码正在编译为 C++,那么这个条件成立。
extern “C” {:如果正在编译为 C++,那么 extern “C” 会告诉编译器,接下来的代码块中的函数应该以 C 的方式进行链接,而不是 C++ 的方式。这是因为在 C++ 中,函数名可以发生函数重载(同一个函数名可以有不同的参数列表),而在 C 中没有这个概念。因此,通过将函数声明包裹在 extern “C” 中,可以确保它们以 C 的方式进行链接,这样cpp代码可以与纯 C 代码一起使用而不会出现问题。
#endif:这是条件编译的结束指令,它用来结束 #ifdef __cplusplus 开始的条件编译块。如果不是在编译 C++ 代码,这个块中的代码会被忽略。
总之,这段代码的作用是确保在 C++ 中使用 C 语言函数时,编译器不会将其与 C++ 的语法特性混淆,从而确保代码的正确性。这在涉及到与 C 代码互操作的情况下非常有用,因为 C++ 和 C 之间存在一些重要的差异。
C++编译的时候会改函数的名字
C++ 在编译时会对函数的名字进行改编,这个过程被称为名称修饰(Name Mangling)。这是因为 C++ 允许函数重载,也就是说,可以定义多个同名函数,只要它们的参数列表不同。为了区分这些重载函数,C++ 编译器会对函数名进行修饰,将参数信息包含在函数名中,从而创建唯一的函数标识符。
举例来说,如果有以下两个函数:
int add(int a, int b);
double add(double a, double b);
在编译时,C++ 编译器会对这两个函数的名称进行改编,以便区分它们。名称修饰的结果可能会变成类似于 _Z3addii 和 _Z3adddd 这样的标识符,具体的修饰规则取决于编译器和平台。
然而,C 语言不支持函数重载,因此在 C 中不需要进行名称修饰。函数的名称在 C 中保持原样。这就是为什么在 C++ 中与 C 代码进行交互时需要使用 extern “C” 声明来告诉编译器不要对函数名称进行修饰,以便正确链接到 C 代码。
所以,为了确保 C++ 代码与 C 代码正确地进行交互,需要使用 extern “C” 声明,以防止 C++ 编译器对函数名称进行修饰,从而保持与 C 代码的兼容性。这样可以确保 C++ 代码能够与不进行名称修饰的 C 函数正确匹配。
从汇编的角度详细解释
名称修饰(Name Mangling)是一个高级语言(如C++)到汇编语言层面的概念,它涉及到函数和类的名称在汇编代码中的表示方式。不同编译器和平台可能会有不同的名称修饰规则,下面我将通过一个简单的例子来说明这个概念。
首先,让我们看一个简单的C++代码(extern “C”):
#include <iostream>
extern "C"
{
int add(int a, int b) {return a + b;
}
}
int main() {int result = add(3, 4);std::cout << result << std::endl;return 0;
}
接下来,我们将使用 g++ 编译这段代码,并通过汇编工具查看生成的汇编代码。可以使用以下命令来编译代码并生成汇编文件:
g++ -S -o example.s example.cpp
上述命令中,-S 选项告诉 g++ 生成汇编代码,并将其输出到 example.s 文件中。现在,让我们查看生成的 example.s 文件:
.file "example.cpp".text.local _ZStL8__ioinit.comm _ZStL8__ioinit,1,1.globl add.type add, @function
add:
.LFB1731:.cfi_startprocendbr64pushq %rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq %rsp, %rbp.cfi_def_cfa_register 6movl %edi, -4(%rbp)movl %esi, -8(%rbp)movl -4(%rbp), %edxmovl -8(%rbp), %eaxaddl %edx, %eaxpopq %rbp.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE1731:.size add, .-add.globl main.type main, @function
main:
.LFB1732:.cfi_startprocendbr64pushq %rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq %rsp, %rbp.cfi_def_cfa_register 6subq $16, %rspmovl $4, %esimovl $3, %edicall addmovl %eax, -4(%rbp)movl -4(%rbp), %eaxmovl %eax, %esileaq _ZSt4cout(%rip), %raxmovq %rax, %rdicall _ZNSolsEi@PLTmovq _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@GOTPCREL(%rip), %rdxmovq %rdx, %rsimovq %rax, %rdicall _ZNSolsEPFRSoS_E@PLTmovl $0, %eaxleave.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE1732:.size main, .-main.type _Z41__static_initialization_and_destruction_0ii, @function
_Z41__static_initialization_and_destruction_0ii:
.LFB2232:.cfi_startprocendbr64pushq %rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq %rsp, %rbp.cfi_def_cfa_register 6subq $16, %rspmovl %edi, -4(%rbp)movl %esi, -8(%rbp)cmpl $1, -4(%rbp)jne .L7cmpl $65535, -8(%rbp)jne .L7leaq _ZStL8__ioinit(%rip), %raxmovq %rax, %rdicall _ZNSt8ios_base4InitC1Ev@PLTleaq __dso_handle(%rip), %raxmovq %rax, %rdxleaq _ZStL8__ioinit(%rip), %raxmovq %rax, %rsimovq _ZNSt8ios_base4InitD1Ev@GOTPCREL(%rip), %raxmovq %rax, %rdicall __cxa_atexit@PLT
.L7:nopleave.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE2232:.size _Z41__static_initialization_and_destruction_0ii, .-_Z41__static_initialization_and_destruction_0ii.type _GLOBAL__sub_I_add, @function
_GLOBAL__sub_I_add:
.LFB2233:.cfi_startprocendbr64pushq %rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq %rsp, %rbp.cfi_def_cfa_register 6movl $65535, %esimovl $1, %edicall _Z41__static_initialization_and_destruction_0iipopq %rbp.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE2233:.size _GLOBAL__sub_I_add, .-_GLOBAL__sub_I_add.section .init_array,"aw".align 8.quad _GLOBAL__sub_I_add.hidden __dso_handle.ident "GCC: (Ubuntu 11.3.0-1ubuntu1~22.04.1) 11.3.0".section .note.GNU-stack,"",@progbits.section .note.gnu.property,"a".align 8.long 1f - 0f.long 4f - 1f.long 5
0:.string "GNU"
1:.align 8.long 0xc0000002.long 3f - 2f
2:.long 0x3
3:.align 8
4:
在上述汇编代码中,我们关注的是 add函数和 main 函数。注意以下几点:
-
.globl add表示 add 函数是全局可见的,这是因为我们在 main 函数中调用了它。
-
.type add, @function 表示 add 函数是一个函数。
-
.size add, .-add 给出了 add 函数的大小。
-
add: 标识了 add 函数的入口点。
-
call add是在 main 函数中调用 add 函数的指令。
从这个例子中,可以看到函数 add 在汇编代码中的名称没有发生明显的变化,因为这是一个普通的 C 函数。名称修饰通常在涉及到函数重载、命名空间、类等高级语言特性时变得更加复杂。不同的编译器和平台可能会使用不同的规则来进行名称修饰,所以具体的名称修饰方式会有所不同。
下面是不使用extern "C"的汇编代码:
#include <iostream>int add(int a, int b) {return a + b;
}int main() {int result = add(3, 4);std::cout << result << std::endl;return 0;
}
再次使用以下命令来编译代码并生成汇编文件:
g++ -S -o example.s example.cpp
查看生成的 example.s 文件:
.file "example.cpp".text.local _ZStL8__ioinit.comm _ZStL8__ioinit,1,1.globl _Z3addii.type _Z3addii, @function
_Z3addii:
.LFB1731:.cfi_startprocendbr64pushq %rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq %rsp, %rbp.cfi_def_cfa_register 6movl %edi, -4(%rbp)movl %esi, -8(%rbp)movl -4(%rbp), %edxmovl -8(%rbp), %eaxaddl %edx, %eaxpopq %rbp.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE1731:.size _Z3addii, .-_Z3addii.globl main.type main, @function
main:
.LFB1732:.cfi_startprocendbr64pushq %rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq %rsp, %rbp.cfi_def_cfa_register 6subq $16, %rspmovl $4, %esimovl $3, %edicall _Z3addiimovl %eax, -4(%rbp)movl -4(%rbp), %eaxmovl %eax, %esileaq _ZSt4cout(%rip), %raxmovq %rax, %rdicall _ZNSolsEi@PLTmovq _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@GOTPCREL(%rip), %rdxmovq %rdx, %rsimovq %rax, %rdicall _ZNSolsEPFRSoS_E@PLTmovl $0, %eaxleave.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE1732:.size main, .-main.type _Z41__static_initialization_and_destruction_0ii, @function
_Z41__static_initialization_and_destruction_0ii:
.LFB2232:.cfi_startprocendbr64pushq %rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq %rsp, %rbp.cfi_def_cfa_register 6subq $16, %rspmovl %edi, -4(%rbp)movl %esi, -8(%rbp)cmpl $1, -4(%rbp)jne .L7cmpl $65535, -8(%rbp)jne .L7leaq _ZStL8__ioinit(%rip), %raxmovq %rax, %rdicall _ZNSt8ios_base4InitC1Ev@PLTleaq __dso_handle(%rip), %raxmovq %rax, %rdxleaq _ZStL8__ioinit(%rip), %raxmovq %rax, %rsimovq _ZNSt8ios_base4InitD1Ev@GOTPCREL(%rip), %raxmovq %rax, %rdicall __cxa_atexit@PLT
.L7:nopleave.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE2232:.size _Z41__static_initialization_and_destruction_0ii, .-_Z41__static_initialization_and_destruction_0ii.type _GLOBAL__sub_I__Z3addii, @function
_GLOBAL__sub_I__Z3addii:
.LFB2233:.cfi_startprocendbr64pushq %rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq %rsp, %rbp.cfi_def_cfa_register 6movl $65535, %esimovl $1, %edicall _Z41__static_initialization_and_destruction_0iipopq %rbp.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE2233:.size _GLOBAL__sub_I__Z3addii, .-_GLOBAL__sub_I__Z3addii.section .init_array,"aw".align 8.quad _GLOBAL__sub_I__Z3addii.hidden __dso_handle.ident "GCC: (Ubuntu 11.3.0-1ubuntu1~22.04.1) 11.3.0".section .note.GNU-stack,"",@progbits.section .note.gnu.property,"a".align 8.long 1f - 0f.long 4f - 1f.long 5
0:.string "GNU"
1:.align 8.long 0xc0000002.long 3f - 2f
2:.long 0x3
3:.align 8
4:
要查看真正的名称修饰效果,可以尝试创建一个包含类和函数重载的更复杂的 C++ 示例,并查看生成的汇编代码,以了解不同情况下的名称修饰规则。但需要注意的是,名称修饰通常是编译器的内部实现细节,不同编译器可能会有不同的名称修饰方案。
下面是一个包含类和函数重载的较复杂的 C++ 示例:
#include <iostream>class Math {
public:int add(int a, int b) {return a + b;}double add(double a, double b) {return a + b;}
};int main() {Math math;int intResult = math.add(3, 4);double doubleResult = math.add(2.5, 3.7);std::cout << "Integer result: " << intResult << std::endl;std::cout << "Double result: " << doubleResult << std::endl;return 0;
}
在这个示例中,我们定义了一个名为 Math 的类,其中包含了两个 add 函数,一个用于整数相加,另一个用于浮点数相加。这两个函数具有相同的名称,但参数类型不同,这就是函数重载。
接下来,我们编译这个示例并查看生成的汇编代码。使用以下命令来生成汇编文件:
g++ -S -o complex_example.s complex_example.cpp
现在,让我们查看生成的 complex_example.s 文件中与 Math 类和 add 函数相关的部分:
.file "complex_example.cpp".text.local _ZStL8__ioinit.comm _ZStL8__ioinit,1,1.section .text._ZN4Math3addEii,"axG",@progbits,_ZN4Math3addEii,comdat.align 2.weak _ZN4Math3addEii.type _ZN4Math3addEii, @function
_ZN4Math3addEii:
.LFB1731:.cfi_startprocendbr64pushq %rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq %rsp, %rbp.cfi_def_cfa_register 6movq %rdi, -8(%rbp)movl %esi, -12(%rbp)movl %edx, -16(%rbp)movl -12(%rbp), %edxmovl -16(%rbp), %eaxaddl %edx, %eaxpopq %rbp.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE1731:.size _ZN4Math3addEii, .-_ZN4Math3addEii.section .text._ZN4Math3addEdd,"axG",@progbits,_ZN4Math3addEdd,comdat.align 2.weak _ZN4Math3addEdd.type _ZN4Math3addEdd, @function
_ZN4Math3addEdd:
.LFB1732:.cfi_startprocendbr64pushq %rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq %rsp, %rbp.cfi_def_cfa_register 6movq %rdi, -8(%rbp)movsd %xmm0, -16(%rbp)movsd %xmm1, -24(%rbp)movsd -16(%rbp), %xmm0addsd -24(%rbp), %xmm0movq %xmm0, %raxmovq %rax, %xmm0popq %rbp.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE1732:.size _ZN4Math3addEdd, .-_ZN4Math3addEdd.section .rodata
.LC2:.string "Integer result: "
.LC3:.string "Double result: ".text.globl main.type main, @function
main:
.LFB1733:.cfi_startprocendbr64pushq %rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq %rsp, %rbp.cfi_def_cfa_register 6subq $32, %rspmovq %fs:40, %raxmovq %rax, -8(%rbp)xorl %eax, %eaxleaq -21(%rbp), %raxmovl $4, %edxmovl $3, %esimovq %rax, %rdicall _ZN4Math3addEiimovl %eax, -20(%rbp)movsd .LC0(%rip), %xmm0movq .LC1(%rip), %rdxleaq -21(%rbp), %raxmovapd %xmm0, %xmm1movq %rdx, %xmm0movq %rax, %rdicall _ZN4Math3addEddmovq %xmm0, %raxmovq %rax, -16(%rbp)leaq .LC2(%rip), %raxmovq %rax, %rsileaq _ZSt4cout(%rip), %raxmovq %rax, %rdicall _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@PLTmovq %rax, %rdxmovl -20(%rbp), %eaxmovl %eax, %esimovq %rdx, %rdicall _ZNSolsEi@PLTmovq _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@GOTPCREL(%rip), %rdxmovq %rdx, %rsimovq %rax, %rdicall _ZNSolsEPFRSoS_E@PLTleaq .LC3(%rip), %raxmovq %rax, %rsileaq _ZSt4cout(%rip), %raxmovq %rax, %rdicall _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@PLTmovq %rax, %rdxmovq -16(%rbp), %raxmovq %rax, %xmm0movq %rdx, %rdicall _ZNSolsEd@PLTmovq _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@GOTPCREL(%rip), %rdxmovq %rdx, %rsimovq %rax, %rdicall _ZNSolsEPFRSoS_E@PLTmovl $0, %eaxmovq -8(%rbp), %rdxsubq %fs:40, %rdxje .L7call __stack_chk_fail@PLT
.L7:leave.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE1733:.size main, .-main.type _Z41__static_initialization_and_destruction_0ii, @function
_Z41__static_initialization_and_destruction_0ii:
.LFB2237:.cfi_startprocendbr64pushq %rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq %rsp, %rbp.cfi_def_cfa_register 6subq $16, %rspmovl %edi, -4(%rbp)movl %esi, -8(%rbp)cmpl $1, -4(%rbp)jne .L10cmpl $65535, -8(%rbp)jne .L10leaq _ZStL8__ioinit(%rip), %raxmovq %rax, %rdicall _ZNSt8ios_base4InitC1Ev@PLTleaq __dso_handle(%rip), %raxmovq %rax, %rdxleaq _ZStL8__ioinit(%rip), %raxmovq %rax, %rsimovq _ZNSt8ios_base4InitD1Ev@GOTPCREL(%rip), %raxmovq %rax, %rdicall __cxa_atexit@PLT
.L10:nopleave.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE2237:.size _Z41__static_initialization_and_destruction_0ii, .-_Z41__static_initialization_and_destruction_0ii.type _GLOBAL__sub_I_main, @function
_GLOBAL__sub_I_main:
.LFB2238:.cfi_startprocendbr64pushq %rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq %rsp, %rbp.cfi_def_cfa_register 6movl $65535, %esimovl $1, %edicall _Z41__static_initialization_and_destruction_0iipopq %rbp.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE2238:.size _GLOBAL__sub_I_main, .-_GLOBAL__sub_I_main.section .init_array,"aw".align 8.quad _GLOBAL__sub_I_main.section .rodata.align 8
.LC0:.long -1717986918.long 1074633113.align 8
.LC1:.long 0.long 1074003968.hidden __dso_handle.ident "GCC: (Ubuntu 11.3.0-1ubuntu1~22.04.1) 11.3.0".section .note.GNU-stack,"",@progbits.section .note.gnu.property,"a".align 8.long 1f - 0f.long 4f - 1f.long 5
0:.string "GNU"
1:.align 8.long 0xc0000002.long 3f - 2f
2:.long 0x3
3:.align 8
4:
在这个汇编代码中,可以看到两个 add 函数的名称发生了变化,它们被命名为 _ZN4Math3addEii 和 _ZN4Math3addEdd。这些名称修饰是由编译器根据函数的参数类型生成的,以确保在汇编级别可以区分这两个重载函数。
这个示例演示了名称修饰在涉及到函数重载的情况下的应用,以确保正确的函数被调用。在实际应用中,名称修饰对于支持函数重载、运算符重载以及类的成员函数等高级语言特性非常重要。
相关文章:
【c/c++】c和cpp混合编译
c和cpp混合编译 #ifdef __cplusplus extern "C" { #endifextern int test(int, int);#ifdef __cplusplus } #endif在这段代码中,#ifdef __cplusplus 和 #endif 之间的代码是为了在 C 中使用 C 语言的函数声明和定义时,确保编译器正确地处理 C…...
springboot定制banner
这里有几个定制banner的网站 Text to ASCII Art Generator (TAAG) ASCII Generator IMG2TXT: ASCII Art Made Easy!...
Qt 入门实战教程(目录)
为何我要写Qt入门教程 前置课程 《C自学精简实践教程》 教程特点 1 面向企业开发,你在这里学到的任何一步操作,都会直接在企业里用到。 2 注重设计思路训练,抽象分析问题的能力。 Qt 安装 1.1 Windows Qt 5.12.10下载与安装 1.2 我们…...

Ceph入门到精通-Lunix性能分析工具汇总
出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章。本文也可以作为检验基础知识的指标,另外文章涵盖了一个系统的方方面面。如果没有完善的计算机系统知识,网络知识和操作系统知识,文档中的工具…...

服务器端使用django websocket,客户端使用uniapp 请问服务端和客户端群组互发消息的代码怎么写的参考笔记
2023/8/29 19:21:11 服务器端使用django websocket,客户端使用uniapp 请问服务端和客户端群组互发消息的代码怎么写 2023/8/29 19:22:25 在服务器端使用Django WebSocket和客户端使用Uniapp的情况下,以下是代码示例来实现服务器端和客户端之间的群组互发消息。 …...

【考研数学】线性代数第四章 —— 线性方程组(2,线性方程组的通解 | 理论延伸)
文章目录 引言四、线性方程组的通解4.1 齐次线性方程组4.2 非齐次线性方程组 五、方程组解的理论延伸 引言 承接前文,继续学习线性方程组的内容,从方程组的通解开始。 四、线性方程组的通解 4.1 齐次线性方程组 (1)基础解系 —…...
go读取文件的几种方法
一. 整个文件读入内存 直接将数据直接读取入内存,是效率最高的一种方式,但此种方式,仅适用于小文件,对于大文件,则不适合,因为比较浪费内存 1.直接指定文化名读取 在 Go 1.16 开始,ioutil.Rea…...

ChatGPT癌症治疗“困难重重”,真假混讲难辨真假,准确有待提高
近年来,人工智能在医疗领域的应用逐渐增多,其中自然语言处理模型如ChatGPT在提供医疗建议和信息方面引起了广泛关注。然而,最新的研究表明,尽管ChatGPT在许多领域取得了成功,但它在癌症治疗方案上的准确性仍有待提高。…...

docker打包vue vite前端项目
打包vue vite 前端项目 1.打包时将测试删除 2.修改配置 3.打包项目 npm run build 显示成功(黄的也不知道是啥) 打包好的前端文件放入 4.配置 default.conf upstream wms-app {server 你自己的ip加端口 ;server 192.168.xx.xx:8080 ; } server { …...
zookeeper 查询注册的 dubbo 服务
1. 连接zookeeper 服务端 使用bin 目录下zk客户端连接服务器, ./zkCli.sh -server 127.0.0.1:2181 2. 查询Dubbo 服务 # 查询所有服务 ls /dubbo # 查询指定服务调用 ls /dubbo/服务名(接口地址)/consumers # 查询指定服务调用 ls /dubbo/服务名(接口地址)/pr…...
【每日一题】57. 插入区间
【每日一题】57. 插入区间 57. 插入区间题目描述解题思路 57. 插入区间 题目描述 给你一个 无重叠的 ,按照区间起始端点排序的区间列表。 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可…...
youtubu视频下载和yt-dlp 使用教程
参考:https://zhuanlan.zhihu.com/p/618467617,使用 yt-dlp 下载 youtube 视频的一点体会 安装yt-dlp 1. 安装Python和ffmpeg Python:安装时把pip和添加系统环境变量都选上 ffmpeg:下载好exe文件,把目录添加到系统环…...

——滑动窗口
滑动窗口 所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。也可以理解为一种双指针的做法。 leetcode76 class Solution {public String minWindow(String s, String t) {char[] schars s.toCharArray();char[] tc…...

【C++进阶】模板进阶
👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:C航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞…...
Vim如何清空文件
在Vim中,可以使用以下命令清空文件内容: 打开需要清空的文件:在终端中输入vim filename打开文件,其中filename是你要编辑的文件名。 进入命令模式:按下键盘上的Esc键,确保处于Vim的命令模式。(…...

问道管理:什么信号?煤飞色舞钢花溅
近期重磅利好不断,对应到A股商场,究竟哪个板块最获益,商场讨论热烈。 地产分析师:方针力度超预期,主张加仓。 银行分析师:存量房贷对银行股心情上的压制完毕,值得重视。 消费分析师ÿ…...

C# PaddleDetection yolo 印章检测
效果 项目 代码 using OpenCvSharp; using OpenCvSharp.Extensions; using Sdcb.PaddleDetection; using Sdcb.PaddleInference; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq…...

常用框架分析(7)-Flutter
框架分析(7)-Flutter 专栏介绍Flutter核心思想Flutter的特点快速开发跨平台高性能美观的用户界面 Flutter的架构框架层引擎层平台层 开发过程使用Dart语言编写代码编译成原生代码热重载工具和插件 优缺点优点跨平台开发高性能美观的用户界面热重载强大的…...
清空 Docker 容器的日志文件
删除容器中netcore控制台存储到docker日志记录 在shell命令下执行如下语句: docker ps -aq | xargs docker inspect --format{{.LogPath}} | xargs truncate -s 0 这个命令会执行以下操作: docker ps -aq:列出所有容器的ID(包括…...

01-虚拟机安装Windows Server操作系统
1、创建并配置虚拟机 2、安装操作系统 找到windows Server镜像 等待安装 3、设置密码...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...

在MobaXterm 打开图形工具firefox
目录 1.安装 X 服务器软件 2.服务器端配置 3.客户端配置 4.安装并打开 Firefox 1.安装 X 服务器软件 Centos系统 # CentOS/RHEL 7 及之前(YUM) sudo yum install xorg-x11-server-Xorg xorg-x11-xinit xorg-x11-utils mesa-libEGL mesa-libGL mesa-…...
c++算法学习3——深度优先搜索
一、深度优先搜索的核心概念 DFS算法是一种通过递归或栈实现的"一条路走到底"的搜索策略,其核心思想是: 深度优先:从起点出发,选择一个方向探索到底,直到无路可走 回溯机制:遇到死路时返回最近…...

World-writable config file /etc/mysql/mysql.conf.d/my.cnf is ignored
https://stackoverflow.com/questions/53741107/mysql-in-docker-on-ubuntu-warning-world-writable-config-file-is-ignored 修改权限 -> 重启mysql # 检查字符集配置 SHOW VARIABLES WHERE Variable_name IN (character_set_server, character_set_database ); --------…...