C与C++的细微区别——省略形式参数名

一、C与C++的细微区别

在函数声明中:
无论是C还是在C++,都 可以省略 形式参数名。
但是,通常都 建议 省略形式参数名。

在函数定义中:
1. 当需要使用形式参数的时候,显然,必须给形式参数命名。

2. 当不需要使用形式参数的时候,C与C++有微小差异:
——  C不能省略形式参数名 ,  即使 不使用。
——  C++可以省略形式参数名 如果 不使用。
—— 并且在C++中,如果给不使用的形式参数命名,可能会得到一个 警告



二、示例:
#include  < stdio.h >

void  greeting_omit( const   char *  name);
void  greeting_unuse( const   char *  name);
void  greeting_nowarning( const   char *  name);

int  main( void ) {
    greeting_omit(
"" );
    greeting_unuse(
"" );
    greeting_nowarning(
"" );
    (
void )getchar();
    
return   0 ;
}



三、三个函数分别实现如下:

        三、1
void  greeting_omit( const   char *  ) {
    printf(
" hello world\n " );
}

——在C中是错误:
1. msvc :
error C2055: expected formal parameter list, not a type list
error C2055: 应输入形参表,而不是类型表

2. gcc : (报错更清晰一些)
error: parameter name omitted
错误: 省略参数名

——在C++中正确,且无警告。

        三、2
void  greeting_unuse( const   char *  name) {
    printf(
" hello Cherrie\n " );
}

在C和C++中都正确,但可能得到一个警告:
1. msvc :
warning C4100: 'name' : unreferenced formal parameter
warning C4100: “name”: 未引用的形参

2. gcc :
warning: unused parameter 'name'
警告: 未使用的参数‘name’

在gcc中,打开这个警告的选项是 -Wunused-parameter
该选项包含在-Wall中。

        三、3
void  greeting_nowarning( const   char *  name) {
    (
void )name;
    printf(
" hello OwnWaterloo\n " );
}

在C和C++中都正确,并且无警告。
### GCC 和 G++ 编译器的功能差异 #### 基本定义用途 GCC 是 GNU Compiler Collection 的缩写,最初设计用于编译 C 语言程序。随着发展,它扩展支持多种编程语言,包括 Fortran、Ada 等[^1]。然而,在处理 C++ 程序时,GCC 需要额外指定标准库选项才能正确链接 C++ 所需的标准库。 G++ 则是 GCC 的一个前端工具,专门针对 C++ 开发优化。当使用 g++ 命令时,默认情况下会自动链接 C++ 标准库 (libstdc++) 并提供更严格的语法检查机制[^2]。 --- #### 文件后缀识别行为 对于文件后缀同的源码文件,GCC 和 G++ 表现如下: - 如果文件后缀为 `.c`,GCC 将其视为纯 C 程序并按照 C 语言规则解析;而即使该文件实际包含 C++ 特定功能(如类或模板),g++ 仍能将其作为 C++ 程序正确解释。 - 对于 `.cpp` 或其他常见 C++ 后缀(如 `.cc`, `.cxx`)的文件,无论是 gcc 还是 g++,均一致认定这些文件属于 C++ 范畴。 --- #### 编译过程中的区别 在单独执行 **编译阶段** 时(即仅生成目标文件而涉及最终可执行文件创建的过程),gcc 和 g++ 几乎无异,因为此时主要依赖底层共享的核心组件完成工作。过需要注意的是,尽管如此,由于默认设置上的同,某些特定场景下可能会观察到细微差别: ```bash # 使用 gcc 编译 C++ 源代码可能需要手动添加 stdc++ 库参数 gcc -c test.cpp -o test.o -lstdc++ # 直接利用 g++ 更加简便快捷 g++ -c test.cpp -o test.o ``` 上述例子展示了如何通过命令行操作实现相同目的——将 `test.cpp` 转化为目标对象文件形式 (`test.o`)。显然采用后者方式更为简洁明了。 而在整个构建流程里(既包含了翻译又涵盖了组装环节直至产出最后成品应用程序为止),选用哪种具体指令变得尤为重要起来。这是因为只有借助像 g++ 这样的专用接口才能够确保所有必要的外部资源都被恰当地引入进来参整体组合运算之中去。 --- #### 总结对比表 | 特性 | GCC | G++ | |---------------------|-----------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------| | 默认链接标准库 | 会自动连接 libstdc++ | 自动连接 libstdc++ | | 处理 .c 文件的方式 | 当作 C 程序 | 当作 C++ 程序 | | 处理 .cpp 文件的方式 | 认为是 C++ | 同样认为是 C++ | | 是否严格遵循 C++ 规范 | 较宽松 | 更加严谨 | --- ### 示例代码展示 以下是两个简单的测试案例分别演示了两种环境下的表现特征: ```cpp // Example of a simple class definition in C++ #include <iostream> class HelloWorld { public: void say_hello() { std::cout << "Hello, world!" << std::endl; } }; int main(){ HelloWorld hw; hw.say_hello(); } ``` 尝试用以下方法运行这段代码可以直观感受两者的差异之处: ```bash # 方法一:使用 g++ g++ example_class.cpp -o example_gpp && ./example_gpp # 方法二:使用 gcc (注意这里必须显式加入 `-lstdc++` 参数) gcc example_class.cpp -o example_cpp -lstdc++ && ./example_cpp ``` 如果省略掉第二个命令里的附加项,则很可能会遭遇错误提示告知缺少相应函数定义等问题发生。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值