作者james732 (好人超)
看板C_and_CPP
标题[问题] macro定义问题
时间Thu May 4 18:52:01 2017
开发平台(Platform): (Ex: Win10, Linux, ...)
windows 10
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
gcc 4.4.4
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
none
问题(Question):
我需要把一些变数放到section里
__attribute__((section(.data.james.foo1))) int var1;
__attribute__((section(.data.james.foo2))) int var2;
主要是foo1, foo2那边会改
因此我想要做个marco,做到这样
MY_SECTION(foo1) int val1;
MY_SECTION(foo2) int val2;
试着写了
#define MY_SECTION(
name) __attribute__((section(.data.james.
##name)))
不过无法通过编译
想知道要怎麽修改,才能正确的达到我的目的
另外C语言的pre-processor有没有比较好的文件 orz
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.136.33.126
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1493895124.A.639.html
1F:→ Hazukashiine: ## 是 string concatenation 这里应该不需要 05/04 19:05
您的意思是说直接写这样就好了吗
#define MY_SECTION(name) __attribute__((section(.data.james.name)))
我试过一样无法编译
话说我搞不太清楚什麽时候要用#或##或不用加orz
2F:→ pttworld: 可以考虑define .data.jame, 再包一层把这个define传入 05/04 19:35
3F:→ pttworld: ,传入後## 05/04 19:35
5F:推 LPH66: 提一件事, 无法编译有很多种, 贴个错误讯息上来吧 05/04 20:15
6F:→ LPH66: 说不定根本就不是 preprocessor 没弄好而是其他问题 05/04 20:15
对不起我懂了,原来是我的section name没有加""所以无法编译
感谢Hazukashiine提供了debug的方式让我找到问题
test.h
#define MY_SECTION(name) __attribute__((section(
".data.james.name
")))
test.c
MY_SECTION(foo1) int value;
这样确定可以用
错误讯息是这样的
xxx.c:3: error: expected ')' before '.' token
xxx.c:3: error: expected identifier or '(' before ')' token
我应该一开始就先写上来才对orz
※ 编辑: james732 (114.136.33.126), 05/04/2017 20:22:27
7F:推 LPH66: 等等, 要加引号的话那可能需要字串化的 # 05/04 20:24
8F:→ LPH66: 你那样出来的东西可能会在 ".data.james.name" 05/04 20:24
9F:→ LPH66: 用个 objdump 确定一下东西对不对吧 05/04 20:25
10F:→ LPH66: 如果确实需要的话, 写法是 section(".data.james." #name) 05/04 20:26
11F:→ james732: 我刚刚发现它编译过就很开心的以为解决了XD 05/04 20:26
12F:→ LPH66: preprocessor 会取代成 section(".data.james." "foo1") 05/04 20:26
用readelf确认一下,确实您所说
最後的正确写法是这样的
#define MY_SECTION(name) __attribute__((section(".data.james." #name)))
非常感谢
※ 编辑: james732 (114.136.33.126), 05/04/2017 20:41:37