相关疑难解决方法(0)

C++中struct/class的历史是什么?

我正在上C++中的面向对象编程课程.在最近的一项任务中,我定义了一个成员函数struct.我的讲师解释说,尽管在结构体中使用成员函数是可编辑的,但他希望我们没有,为了向后兼容C,并且(特别是在这个初学者类中)实践良好的数据封装 - 我们应该使用a struct类型主要包含数据,以及class适用于更多程序封装的应用程序.他表示这种做法来自于C++中结构/类的历史,这是我想要了解的更多内容.

我知道除了默认的成员/继承访问之外,结构在功能上与类相同.我的问题是:

为什么结构和类包含在C++中?从我在C#中的背景,结构和类有重要区别,似乎struct在C++中只是用于定义具有默认public-ness的类的语法糖.是吗?

不是在寻找关于何时/为什么应该使用而不是使用其他人的意见 -在这些结构之后我出生得很好,而且我正在寻找它们的历史.他们在一起构思了吗?如果是这样,为什么?如果没有,哪个是第一个,为什么第二个被添加?我意识到在这个社区中有许多古老的长者可能对这些特征的起源有所记忆,并且标准出版物的链接或代码的例子,其中一个或另一个首次出现,将增加答案的帮助.

请注意,这个问题不是:

c++ standards struct class

15
推荐指数
1
解决办法
1192
查看次数

在C++中使用extern"C"时我到底输了什么?

我正在尝试用C++开发一个动态库,由用IDL(交互式数据语言)编写的现有程序调用.我知道我需要使用extern"C"来禁用名称修改,以便IDL可以调用它需要的函数(其余的调用机制非常简单).

但是,我总是对使用我不完全理解的语言的功能犹豫不决,所以我的问题是:如果有的话,我会通过恢复到C链接而丢失C++的哪些功能?我认为命名空间是一个显而易见的,但它是否完全禁用了C++的所有其他优点?我还可以使用C++ STL,以及我所依赖的所有各种语言功能(特别是C++ 11)吗?还是我坚持用C编码?

c c++ extern linkage

14
推荐指数
1
解决办法
1525
查看次数

我是否需要一个extern"C"块来包含标准C头?

我是否需要一个extern "C" {}块来在C++程序中包含标准C头.只考虑在C++中没有对应项的标准C头.

例如:

extern "C" {
 #include <fcntl.h>
 #include <unistd.h>
}
Run Code Online (Sandbox Code Playgroud)

c++ posix-api

13
推荐指数
2
解决办法
7411
查看次数

如何避免C和C++中的命名空间冲突

我可以使用using namespace指令来避免标识符/变量名称冲突,但是当大型项目中发生文件名或库名称冲突时会发生什么.

C传统的方法是使用递归添加文件#include_next指令.如何在C++不使用该#include_next指令的情况下实现相同的目的,并解决应用程序和共享库中重复文件名的问题.例如,在AIX math.h中围绕class()函数的工作与名为"class"的标识符发生冲突.

/* GNU Lesser GPLv2.1 or later */
#ifndef FFMPEG_COMPAT_AIX_MATH_H
#define FFMPEG_COMPAT_AIX_MATH_H

#define class some_text

#include_next <math.h>

#undef class

#endif /* FFMPEG_COMPAT_AIX_MATH_H */
Run Code Online (Sandbox Code Playgroud)

编辑: 我可以使用,例如class machine-instruction-set二进制文件必须在多个平台上运行?在这种情况下可以有命名空间冲突吗?

c c++ gcc namespaces

12
推荐指数
3
解决办法
8289
查看次数

使用C库头的C++程序将"this"识别为关键字.外部"C"错误?

我的C++程序需要使用外部C库.因此,我正在使用

extern "C"
{
   #include <library_header.h>
}
Run Code Online (Sandbox Code Playgroud)

我需要使用的每个模块的语法.

它一直运作到现在.模块在其头文件中使用名称作为某些变量.C库本身编译得很好,因为据我所知,从来就不是C中的关键字.

但是,尽管我使用了extern"C"语法,但当我包含该头文件时,我的C++程序出错了.

如果我每次重命名与类似的东西C库头文件_this,一切似乎都正常工作.

问题是:

不应在外部的"C"的语法够向后兼容性,至少在语法级别,对于一个头文件?这是编译器的问题吗?

c c++ this header-files extern

12
推荐指数
2
解决办法
1343
查看次数

如何将旧C代码与C++中的保留关键字链接起来?

我有一个10岁以上的C库 - 我相信 - 曾经在过去的好日子里工作得很好,但是当我尝试将它与C++源码(包含主要功能)一起使用时,有一天我遇到了有些困难.

编辑:澄清一下,C库编译得很好gcc,它会生成一个目标文件old_c_library.o.该库认为在某种程度上,这样的C头文件中使用的old_c_library.h#include在D main.cC源文件.然后你的主要C源文件应该编译并与old_c_library.ovia 链接在一起gcc.在这里,我想使用C++源文件main.cpp,并编译/链接它g++.

在编译C++源文件期间发生了以下三个问题:

  1. C库的一个头文件包含C++保留字new(它是一个整数的名称),导致致命错误; 和
  2. C库的一个头文件包含一个calloc调用(缺少显式类型转换),导致致命错误; 和
  3. C库的各种文件包含发生有符号和无符号整数比较的代码,这会导致警告.

编辑:我试图使用#extern "C" { #include "obsolete_c_library.h" }"技巧",如评论中所建议,但这并没有解决我的任何问题.

我可以通过重命名保留字的所有实例并用 - 基本上 - 替换它们来解决问题1.我可以通过类型化calloc调用来解决问题2 .我可能会尝试通过这里建议的想法来解决警告:如何禁用几行代码的GCC警告.

但我仍然想知道,有没有办法以优雅,高层次的方式克服这些困难,而不是真正触及原始图书馆?


相关: C在哪里不是C++的子集?并且不要我投malloc的结果?以及如何使用extern在源文件之间共享变量?.

c c++ portability suppress-warnings

12
推荐指数
1
解决办法
1527
查看次数

如何在c ++中动态调用函数

除了boost(Bind&Function)之外,如何在C++中动态调用函数?

PHP有:

$obj = new MyObject();
$function = 'doSomething';
$obj->$function();
Run Code Online (Sandbox Code Playgroud)

Objective-C有:

MyObject *obj = [[MyObject alloc] init];
SEL function = NSSelectorFromString(@"doSomething");
[obj performSelector: function];
Run Code Online (Sandbox Code Playgroud)

c++ function

11
推荐指数
2
解决办法
9260
查看次数

为什么旧编译器构建的某些库可以链接到现代代码,而其他库则不能?

我们有很多预构建的库(主要通过 CMake),使用 Visual Studio 2017 v141 构建。当我们尝试对使用 Visual STudio 2019 v142 的项目使用这些时,我们会看到如下错误:

错误 C1047 对象或库文件“boost_chrono-vc141-mt-gd-x32-1_68.lib”是由与其他对象不同版本的编译器创建的...

另一方面,我们还使用来自 3rd 方供应商的预编译 .libs,这些供应商已有十多年的历史,当与我们的代码库链接时,这些库工作得很好。

是什么决定了图书馆是否需要重建,为什么有些古老的图书馆还可以使用而其他只有一个版本的图书馆不能使用?

c++ linker visual-studio

11
推荐指数
2
解决办法
267
查看次数

何时使用FOUNDATION_EXPORT?

我有点困惑,因为我们应该在objective-c中使用FOUNDATION_EXPORT,它的目的是什么?任何人都可以用外行来解释一下吗?谢谢!

objective-c

10
推荐指数
1
解决办法
4523
查看次数

如何使用十六进制编辑器在Linux中创建可执行的ELF文件?

只是好奇.这显然不是一个非常好的实际编程解决方案,但是我想在Bless(十六进制编辑器)中创建一个可执行文件.

我的架构是x86.我能制作一个非常简单的程序是什么?你好世界?无限循环?与问题类似,但在Linux中.

linux assembly elf

10
推荐指数
2
解决办法
6544
查看次数