我目前正在尝试理解堆栈是如何工作的,所以我决定自学一些汇编语言,我正在使用这本书:
http://savannah.nongnu.org/projects/pgubook/
我正在使用Gas并在Linux Mint上进行开发.
我有点困惑:
据我所知,堆栈只是一个数据结构.所以我假设如果我在汇编编码我必须自己实现堆栈.然而,这似乎并非如此,因为有像这样的命令
pushl
popl
Run Code Online (Sandbox Code Playgroud)
因此,当在x86架构的汇编中编码并使用Gas语法时:堆栈只是已经实现的数据结构吗?或者它实际上是在硬件级别实现的?或者是别的什么?其他芯片组的大多数汇编语言也已经实现了堆栈吗?
我知道这是一个愚蠢的问题,但实际上我很困惑.
我试图使用__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预处理器生成一个随机数或字符串...嗯...我甚至不知道这是否可行,但我正在尝试动态创建变量(字符串在这里会很有用)和为它们分配值(整数).所以我尝试做了一些事情,但基本问题仍然存在 - 我可以使用预处理器创建一个随机字符串或数字.
我想动态创建一个唯一的变量名称。
这是我的代码:
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
我正在尝试在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) 我正在编写一个简单的宏来显示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) 我见过这个问题:
通过以下答案: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)