推 johnpage: 環境變數會影響程式碼才用define, 如果只是要改變運算結 09/08 13:04
→ johnpage: 果建議用不同的組態檔做切換,例如INI檔案 09/08 13:04
> -------------------------------------------------------------------------- <
作者: s25g5d4 (function(){})() 看板: C_and_CPP
標題: Re: [問題] PreProcessor的運用
時間: Tue Sep 8 16:50:22 2015
※ 引述《Makiyo5566 (五五六六我最棒)》之銘言:
: 最近小妹我遇到一個問題想請問一下
: (敘述有點長,可以直接end看問題)
: 想用preprocessor讓code做到無痛切換環境
: ====================
: 環境1:
: env1->var1, env1->qq1, ...
: 環境2:
: env2_var1, env2_qq1, ...
: ====================
: 目前我是運用define:
: env1:
: #define GG(name) env1->##name
: env2:
: #define GG(name) env2_##name
: 本體Code:
: GG(var1), GG(qq1), ...
: 就可以讓code自動切換
: 但如果
: 環境1:
: env1->var1
: 環境2:
: ENV2_VAR1
: 問題來了:
: 我想要靠
: GG(var1) 生出 ENV2_VAR1 (大寫)
: 有什麼辦法嗎?
: 目前想到的是用兩次define,可是precompiler沒有次序性,所以失敗:
: #define var1 VAR1
: #define GG(name) ENV2_##name
: preproc GG(var1)出來還是 ENV2_var1 不會是預期的 ENV2_VAR1
: 問題一:
: 1. 有沒有技巧可以調整predefine ## 的大小寫
: 2. 有沒有方法讓preproc.像上面能夠有關聯性的執行(好像不太可能?)
preprocessor 不可能轉換大小寫
但是你原先的想法是可行的,只需要加個 proxy 就好
範例:
#define var1 VAR1
#define GG(name) ENV_##name
#define GG_proxy(name) GG(name)
GG_proxy(var1)
GG_proxy(test)
用 gcc -E filename.c 可以看到 preprocess 後結果
: 問題二:
: 要怎麼達到這種效果(就是想要取代有意義的字,如member ptr):
: #define env1->name env2_##name
我認為不太可能達成
preprocessor 把單一字元分為 identifier, punctuator... 等等不同 class
而 #define 後面只能接 identifier, 以 gcc 官方文件來講的話就是
any sequence of letters, digits, or underscores, which begins with a
letter or underscore.
當然要是有甚麼奇技淫巧真的可以做到的話就太神奇了
: 問題很奇怪,但小妹一直很困擾,感謝各位解答~~