首页 > 试题广场 >

关于下面代码的说法正确的是extern"C"{void...

[单选题]
关于下面代码的说法正确的是()
extern "C" {
    void foo(int) { }
}

  • "C" 代表c语言
  • 这段代码应于在c++语言代码中
  • 这段代码告诉c++调用者这是一段C代码
  • 用nm查看,foo实际被命名为类似风格 `__Z4fooi`
我来说下选项D。我们用nm命令查看汇编代码,由GNU C++汇编生成的改编后的函数名规则如下:
每个改编后的函数名(除了main函数)以2个下划线(__)开始,后跟字母Z、一个数值和函数名在跟着形参列表的编码(没有形参就不用了)。字母Z后的数值表示函数名称中字符的个数。例如,函数
int donothing(char a, int b, float &c, double &d)
在它的函数名中有9个字符,所以改编后名字的前缀是__Z9。然后,接着跟着函数名,后跟有它的形参列表的编码。在函数donothing的形参列表中char表示为c, int表示为i, float &表示为 Rf, double &表示为Rd。所以最终汇编形成的函数名为:
__Z9donothingciRfRd
说到这里大家就知道为什么d是错的了。
其实这个改编后的函数名就是函数签名,当发生函数重载时,编译器根据这个来区分该调用哪个函数。注意函数签名没有包括返回类型,所以如果2个函数只是返回类型不一样,函数签名一样,编译器还是无法区分就会发生报错啦。

编辑于 2021-01-09 19:31:21 回复(4)
extern "C"指令中的C,表示的一种编译和连接规约,而不是一种语言。C表示符合C语言的编译和连接规约的任何语言,如Fortran、assembler等。
发表于 2017-09-17 10:35:30 回复(1)
C++在编译的时候为了解决函数多态的问题,会将函数名和参数联合起来生成一个中间的函数名称,这个‘C’就代表不要给我生成中间的函数名称,按照C语言的编译来
发表于 2017-11-18 20:41:27 回复(1)
extern "C"指令中的C,表示的一种编译和连接规约,而不是一种语言。C表示符合C语言的编译和连接规约的任何语言,如Fortran、assembler等
发表于 2021-03-09 00:10:24 回复(0)
c++与c的名字编码不一样,在c++中使用c函数需要告诉编译器按照c的名字编码去查找
加上extern "C"后,会指示编译器这部分代码按c语言的进行编译,而不是C++的
发表于 2017-09-10 20:09:14 回复(0)
加上extern "C"后,会指示编译器这部分代码按c语言的进行编译,而不是C++的
发表于 2017-08-30 20:32:04 回复(0)

外部 "C" 块告诉 C++ 编译器,其中的函数应该按照 C 语言的命名规范进行命名,这样在链接时可以正确地与 C 语言函数进行匹配。因此,这段代码使得函数foo符合C语言的命名规范,可以被C++调用。

选项A中的"C" 代表的确实是C语言,但并不完全符合题目中的情景。

选项D提到通过nm查看,foo实际被命名为类似风格__Z4fooi,这是C++编译器对函数符号进行了修饰,而外部 "C" 块的作用就是告诉编译器不要对函数符号进行修饰,保持和C语言的一致性。

发表于 2023-11-10 15:02:51 回复(0)
extern "C"指令中的C,表示的一种编译和连接规约,而不是一种语言。C表示符合C语言的编译和连接规约的任何语言,如Fortran、assembler等
发表于 2022-03-15 16:16:02 回复(0)
在C++中,extern “C” 是一个用于指定函数或变量的链接类型的关键字。当函数或变量被声明为 “extern C” 时,它们的名称将按照C语言的命名规范进行链接,而不是C++的命名规范。这是为了方便在C++代码中调用C语言代码。在给定的示例中,extern “C” 包围函数声明,表示该函数的链接类型是C链接。这意味着函数foo(int)将按照C语言的约定进行链接,可以在C++代码中调用它。
发表于 2023-08-30 16:35:04 回复(0)
"C" 代表类c语言
发表于 2017-09-13 21:06:23 回复(0)
c++与c的名字编码不一样,在c++中使用c函数需要告诉编译器按照c的名字编码去查找
发表于 2017-09-05 19:21:36 回复(1)