精華區beta C_and_CPP 關於我們 聯絡資訊
最近小妹我遇到一個問題想請問一下 (敘述有點長,可以直接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.像上面能夠有關聯性的執行(好像不太可能?) 問題二: 要怎麼達到這種效果(就是想要取代有意義的字,如member ptr): #define env1->name env2_##name 問題很奇怪,但小妹一直很困擾,感謝各位解答~~ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.221.50.98 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1441684047.A.1D3.html ※ 編輯: Makiyo5566 (61.221.50.98), 09/08/2015 11:52:21
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. 當然要是有甚麼奇技淫巧真的可以做到的話就太神奇了 : 問題很奇怪,但小妹一直很困擾,感謝各位解答~~