小编kre*_*tar的帖子

编译过程

谁能解释编译是如何工作的?

我似乎无法弄清楚编译是如何工作的..

更具体地说,这是一个例子..我正在尝试在MSVC++ 6中编写一些代码来加载Lua状态.

我已经:

  • 设置库的其他目录并将文件包含到正确的目录中
  • 使用extern"C"(因为Lua只是C,所以我听说)
  • 包括正确的头文件

但是我仍然在MSVC++ 6中遇到一些关于未解析的外部符号的错误(对于我使用的Lua函数).

尽管我想知道如何解决这个问题并继续前进,但我认为如果我了解所涉及的基础过程对我来说会好得多,所以有人可能会为此写一个很好的解释吗?我想知道的是这个过程..它看起来像这样:

步骤1:

  • 输入:源代码
  • 过程:解析(可能在这里添加更多细节)
  • 输出:这里输出的是什么..

第2步:

  • 输入:无论从步骤1输出什么,加上可能还需要其他任何东西(库?DLL?.so?.lib?)
  • 过程:无论输入做什么
  • 输出:无论输出是什么

等等..

谢谢..

也许这将解释什么是符号,究竟什么是"链接",什么是"对象"代码或者其他什么.

谢谢..抱歉这样的菜鸟..

PS这不一定是语言特定的..但随意用你最舒服的语言表达它.. :)

编辑:所以无论如何,我能够解决错误,事实证明我必须手动将.lib文件添加到项目中; 只需在IDE设置或项目设置中指定库目录(.lib所在的位置)不起作用..

但是,下面的答案在一定程度上帮助我更好地理解了这个过程.非常感谢!如果有人还想写一篇详尽的指南,请做.. :)

编辑:仅供参考,我发现一篇作者(Mike Diehl)的两篇文章很好地解释了这一点.:) 检查编译过程:第1部分 检查编译过程:第2部分

compiler-construction lua visual-c++-6 visual-c++

7
推荐指数
2
解决办法
2529
查看次数

将c ++结构转储到文本文件中

如何将C++中的结构内容写入文本文件?我想要做的是,比如我有一个名为A的结构,数据成员是A.one,A.two等等,我想逐行将它们写成文本文件,就像这样

结构A
A.one =值
A.two =值...

结构B
B.one =值
B.two =值

基本上我想要转储..有一个简单的方法来做到这一点?什么是最好的I/O方法?CFile的?iostream的?谢谢..是否有更简单的方法来转储类的成员数据的所有值?


编辑:废话,谢谢你们..

c++ file-io logging

7
推荐指数
2
解决办法
4546
查看次数

切换到Linux进行Windows开发,不好主意?

我正在考虑从Windows环境转向Linux for C++开发.这是一个坏主意吗?我的工作场所使用Windows和Visual Studio作为我们的项目(也有一些C#和java,但是现在我只用C++开发).如果他们决定让我参加一个C#项目,那么开发还是可以的(单声道?)?这种过渡有哪些困难?

我是否会在他们的项目上工作有问题,反之亦然?我在某处读到预编译头文件有问题(我们确实使用它们)和编码(标签/空格,行结尾等).

如果这个开关不太难,我该如何开始?IDE?VIM +做什么呢?

谢谢.

顺便说一句,我们制作了MOSTLY windows软件..


编辑:谢谢你们,我想这是有道理的..

c++ linux windows development-environment cross-platform

6
推荐指数
2
解决办法
3525
查看次数

Microsoft _s函数,它们现在是C++标准的一部分吗?

我刚刚将我的IDE更改为来自MSVC++ 6的MS Visual Studio 2005,并且我收到了很多弃用警告.我没有忽略警告,而是开始将它们改为_s等价物.但是,我发现这些只是微软的实现.

我在某处读到他们正在推动这些成为标准的一部分.是吗?

使用这些_s函数是个好主意吗?或者我应该使用其他东西?

谢谢.

c++ standards

6
推荐指数
1
解决办法
2190
查看次数

使用g ++在Windows上创建文件,链接库

我已经厌倦了MSVC++ 6以及每个人总是告诉我这是一个糟糕的编译器等等.

所以现在我决定尝试使用vim plus g ++和makefile.这是我的问题; 我有以下makefile:

# This is supposed to be a comment..
CC = g++
# The line above sets the compiler in use..
# The next line sets the compilation flags
CFLAGS=-c -Wall

all: main.exe

main.exe: main.o Accel.o
    $(CC) -o main.exe main.o Accel.o 

main.o: main.cpp Accel.h
    $(CC) $(CFLAGS) main.cpp

Accel.o: Accel.cpp Accel.h
    $(CC) $(CFLAGS) Accel.cpp

clean:
    del main.exe *.o
Run Code Online (Sandbox Code Playgroud)

这在尝试时会出错make,因为我需要链接到一个Ws2_32.lib所需的Windows库,这是Winsock2.hinclude在我的一个.h文件中所需要的.

那我该怎么做?我已经尝试过这个-l选项,但我无法让它发挥作用.它如何与具有空格的路径一起使用?

c++ windows makefile g++

4
推荐指数
1
解决办法
2万
查看次数

删除std :: map(Visual C++)

我有一个指向我想要删除的地图的指针(这个地图分配了新的).

这张地图是有效的,我认为,当我在它悬停在调试时,它显示pMap:[0]()..

当我尝试删除这个空白地图时,我的应用程序就退出了,我得到了一个

myapp.exe中0xsomelocation处的第一次机会异常:0xsomenumber:调用的对象已与其客户端断开连接.

在输出窗口中.这是什么意思?

谢谢..

编辑:这是一些示例代码:

typedef map<const char*, StructA*, StructB> myMap;
typedef vector<myMap *> myMapStack;
Run Code Online (Sandbox Code Playgroud)

StructB有一个重载的运算符() Edit:StructB IS确实是一个结构,对不起,operator()只是一个比较函数的字符串.

在我的代码的某些部分,类的构造函数调用一个方法,让我们称之为InitClass(),初始化一个myMap指针,如下所示:

pMyMap = new myMap; // I also tried this with new myMap()
// this pointer is then pushed onto the a map stack
pMyMapStack.push_back(pMyMap);
Run Code Online (Sandbox Code Playgroud)

后来在这个类的析构函数中,我走了

pMyMap = pMyMapStack.back();
pMyMapStack.pop_back();

delete pMyMap; // after I step over this line the app quits.. and displays that message
Run Code Online (Sandbox Code Playgroud)

谢谢

编辑:我恢复到旧版本的代码工作,它现在工作正常..

有效的是这样的:

// after the pMyMapStack.pop_back()
int x …
Run Code Online (Sandbox Code Playgroud)

c++ destructor stdmap visual-c++ delete-operator

4
推荐指数
1
解决办法
1397
查看次数

C++中的指针类型有什么意义?

假设我有一些指针:

char * pChar;
int * pInt;
Run Code Online (Sandbox Code Playgroud)

我知道它们都只是保存指向某个其他位置的内存地址,并且类型声明了特定指针指向的内存位置有多大.例如,一个char可能是系统上一个字节的大小,而一个int可能是4个字节..所以当我这样做时:

pChar++; // I am actually incrementing the address pointed to by pChar by 1 byte;
pInt++; // I am actually incrementing the address pointed to by pInt by 4 bytes;
Run Code Online (Sandbox Code Playgroud)

但是如果我这样做会怎样

pChar+2; // increment the address pointed to by pChar by 2 bytes?
pInt+2; // increment the address pointed to by pInt by 2 bytes? what happens to the other two bytes?
Run Code Online (Sandbox Code Playgroud)

谢谢..在此感谢任何澄清..指针类型是否只是为了++操作?

编辑:所以avp恰当地回答了我的问题,但我有一个跟进问题,当我这样做时会发生什么:

memcpy(pChar,pInt,2);
Run Code Online (Sandbox Code Playgroud)

它会复制2个字节吗?还是4个字节?我是否会违反访问权限?

编辑:根据Ryan Fox的说法,答案是2个字节,因为它们被强制转换为(void*).谢谢!关闭!

编辑:以便未来的搜索者可以找到这个..我发现的另一条信息..

memcpy(pChar+5,pInt+5,2);
Run Code Online (Sandbox Code Playgroud)

没有将pInt + …

c++ pointers memcpy

3
推荐指数
2
解决办法
909
查看次数

什么时候适合使用C++异常?

我正在尝试设计一个需要动态分配一些内存的类.

我曾计划在构建期间分配它所需的内存,但是如何处理失败的内存分配?我应该抛出异常吗?我在某处读到异常应仅用于"特殊"情况,而内存耗尽对我来说似乎不是特例.

我应该在单独的初始化例程中分配内存并检查故障,然后优雅地销毁类实例吗?

或者我应该使用例外吗?如果这些内存分配失败,该类将没有任何用处.


编辑:共识似乎是内存不足是一个例外情况.

会看到如何去做这个..谢谢.. :)

c++ memory error-handling exception raii

3
推荐指数
1
解决办法
761
查看次数

如何避免阻塞(C++,Win32)

我正在制作一个必须响应应用程序请求的DLL.应用程序的要求之一是调用不需要很长时间才能完成.

说,我有一个函数foo(),由宿主应用程序调用:

int foo(arg){
    // some code i need to execute, say,
    LengthyRoutine();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

可以说,foo必须执行一项确定需要很长时间的任务(或调用函数).该应用程序允许我设置一个等待变量; 如果foo返回时此变量为非零,则会一次又一次地调用foo(在每次调用之前重置wait变量),直到wait返回0.

什么是最好的方法?

我去吧

int foo(arg){

    if (inRoutine == TRUE) {
        wait = 1;
        return 0;
    } else {
        if (doRoutine == TRUE) {
             LengthyRoutine();
             return 0;
        }
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这并没有真正解决LongyRoutine需要很长时间才能完成的问题.我是否应该生成某种类型的线程,根据它是否已完成其任务,更新inRoutine?

谢谢..

c++ multithreading blocking

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

什么多字节字符集以0x7F开头并且长度为4个字节?

我正在尝试使用一些遗留代码来正确显示中文字符.我尝试使用的一个字符编码以0x7F开头,长度为4个字节(包括0x7F字节).有谁知道这是什么样的编码以及我可以在哪里找到它的信息?谢谢..

更新:我还必须使用一些日语编码,它以0xE3开始每个字符并且长度为3个字节.如果我在Windows中选择日语语言环境,它会在我的计算机上正确显示,但是它在我们的应用程序中无法正确显示.但是,如果选择了除日语之外的任何其他语言环境,我甚至无法正确查看文件名.所以我猜这个编码不是Unicode.有人知道这是什么吗?是ANSI吗?它是Shift JIS吗?

对于中文版,我用Unicode和UTF-8字符进行了测试,我得到了相同的模式; 0x7F后跟三个字节.Unicode和UTF-8是一样的吗?

encoding mbcs

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