相关疑难解决方法(0)

堆栈如何在汇编语言中工作?

我目前正在尝试理解堆栈是如何工作的,所以我决定自学一些汇编语言,我正在使用这本书:

http://savannah.nongnu.org/projects/pgubook/

我正在使用Gas并在Linux Mint上进行开发.

我有点困惑:

据我所知,堆栈只是一个数据结构.所以我假设如果我在汇编编码我必须自己实现堆栈.然而,这似乎并非如此,因为有像这样的命令

pushl
popl
Run Code Online (Sandbox Code Playgroud)

因此,当在x86架构的汇编中编码并使用Gas语法时:堆栈只是已经实现的数据结构吗?或者它实际上是在硬件级别实现的?或者是别的什么?其他芯片组的大多数汇编语言也已经实现了堆栈吗?

我知道这是一个愚蠢的问题,但实际上我很困惑.

assembly stack

71
推荐指数
5
解决办法
10万
查看次数

使用__LINE__为不同的变量名创建宏

可能重复:
使用##和LINE创建C宏(使用定位宏进行标记连接)

我试图使用__LINE__宏来生成不同的变量名称.我有一个名为Benchmark的作用域基准测试类(位于utils命名空间中),它的构造函数接受一个字符串.这是我创建的宏定义:

#define BENCHMARK_SCOPE utils::Benchmark bm##__LINE__(std::string(__FUNCTION__))
Run Code Online (Sandbox Code Playgroud)

不幸的是,这会导致以下错误:

<some_file_name>(59): error C2374: 'bm__LINE__' : redefinition; multiple initialization

这使我得出结论__LINE__宏不会扩展.我根据这篇文章创建了我的超时空.你有想法为什么__LINE__不扩大?

编辑:可能编译器信息也相关.我正在使用visual studio 2010.

c++ macros concatenation visual-studio-2010 c-preprocessor

13
推荐指数
3
解决办法
8964
查看次数

使用C预处理器生成随机数

我想使用C预处理器生成一个随机数或字符串...嗯...我甚至不知道这是否可行,但我正在尝试动态创建变量(字符串在这里会很有用)和为它们分配值(整数).所以我尝试做了一些事情,但基本问题仍然存在 - 我可以使用预处理器创建一个随机字符串或数字.

random c-preprocessor

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

如何构建本地唯一的标识符名称?

我想动态创建一个唯一的变量名称。

这是我的代码:

int call(int i)
{
    return i;
}
 
#define XCAT3(a, b, c)    a ## b ## c
 
#define CALL_2(arg, place, line) int XCAT3(cl, place, line) = call(arg);
 
#define CALL_1(arg)    CALL_2(arg, __FUNCTION__, __LINE__)
 
int main(int argc, char* argv[])
{
    CALL_1(1); /* this is line 20 */
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这在 GCC ( http://ideone.com/p4BKQ )中有效,但不幸的是在 Visual Studio 2010 或 2012 中无效。

错误信息是:

test.cpp(20): 错误 C2143: 语法错误: 缺少 ';' 在“函数字符串”之前

test.cpp(20): 错误 C2143: 语法错误: 缺少 ';' 在“常数”之前

test.cpp(20): 错误 C2106: '=' : …

c++ uniqueidentifier visual-studio-2010 visual-c++ c-preprocessor

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

在main()之前的编译时或运行时初始化函数指针的全局数组

我正在尝试在C或C++中在编译时初始化函数指针的全局数组.像这样的东西:

module.h中

typedef int16_t (*myfunc_t)(void);
extern myfunc_array[];
Run Code Online (Sandbox Code Playgroud)

module.cpp

#include "module.h"
int16_t myfunc_1();
int16_t myfunc_2();
...
int16_t myfunc_N();

// the ordering of functions is not that important
myfunc_array[] = { myfunc_1, myfunc_2, ... , myfunc_N };
Run Code Online (Sandbox Code Playgroud)

func1.cpp,func2.cpp,... funcN.cpp(指向单个func.cpp文件的符号链接,以便创建不同的目标文件:func1.o,func2.o,func3.o,...,funcN .o.NUMBER定义使用g++ -DNUMBER=N)

#include "module.h"
#define CONCAT2(x, y) x ## y
#define CONCAT(x, y) CONCAT2(x, y)

int16_t CONCAT(myfunc_, NUMBER)() { ... }
Run Code Online (Sandbox Code Playgroud)

使用g ++ -DNUMBER = N编译时,预处理后变为:

func1.cpp

...
int16_t myfunc_1() { ... }
Run Code Online (Sandbox Code Playgroud)

func2.cpp

...
int16_t myfunc_2() { ... } …
Run Code Online (Sandbox Code Playgroud)

c c++

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

令牌粘贴和__LINE__

我正在编写一个简单的宏来显示TRACE信息.

这就是我正在使用的,

#ifdef __DEBUG__
#define TRACE  { PrintErrorMsg("Trace exception at " __FILE__  "LineNo:"##(__LINE__) "Function: " __FUNCTION__ " " );}
#else 
#define TRACE 
#endif
Run Code Online (Sandbox Code Playgroud)

这与FILE一起使用,但它似乎不适用于LINE,任何想法我怎么能处理这个.我已经尝试过使用字符串操作符.这是如下所示.

#ifdef __DEBUG__
#define TRACE  { PrintErrorMsg("Trace exception at " __FILE__  "LineNo:"#(__LINE__) "Function: " __FUNCTION__ " " );}
#else 
#define TRACE 
#endif
Run Code Online (Sandbox Code Playgroud)

没有parms和双parms,前 - __LINE__((__LINE__)) 任何想法我怎么能处理这个问题?

我想出来了,

#ifdef __DEBUG__
#define ERROR_MSG_BUF_SIZE 1024
#define TRACE  { char * error_msg_buffer = new char[ERROR_MSG_BUF_SIZE]; \
                 sprintf(error_msg_buffer,"Trace Exception at file: %s ,Line : %d , …
Run Code Online (Sandbox Code Playgroud)

c++ macros file

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

变量名中的__COUNTER__

我见过这个问题:

如何使用宏在C++中生成随机变量名?

通过以下答案:https://stackoverflow.com/a/1675203/551045

我试图在clang中实现它.

这里是我的报关表:

#define TRACE(stream) FuncTrace x#__COUNTER__ (llvm::errs(), "hallo", 1)
Run Code Online (Sandbox Code Playgroud)

我尝试了所有的变化x##__COUNTER__; x ## __COUNTER__等等,但似乎没有工作.

这可能是一个铿锵的bug吗?clang 帮助页面说它有__COUNTER__宏.

最后宏我需要这样的东西:

#define TRACE(stream) FuncTrace x#__COUNTER__ (stream, __FUNCTION__, __LINE__)
Run Code Online (Sandbox Code Playgroud)

c++ macros clang c-preprocessor

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