作者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/m.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