作者viajimmy (爆肝人生)
看板C_and_CPP
标题[问题] Run Time选择Header file的可能?
时间Tue Oct 11 15:03:24 2016
开发平台(Platform): (Ex: Win10, Linux, ...)
DOS
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
C
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
问题(Question):
是否能在Run time时由条件式去决定要include header file?
Compilier time 我没问题.
原由是我现在开发一个tool要跨Project.
里面吃了别的部门生成的header file.
只是里面有的许多相同的define name但给不同的值.
Ex:
Project1.h
#define inputWindow1 0x100
Project2.h
#define inputWindow1 0x200
有没有类似这样这样的做法(语法是错的, 不要当我XDD)
if(input == 1)
#include <lib\project1.h>
else
#include <lib\project2.h>
补充说明(Supplement):
我google了C dynamic include header file.
但找了很久都没有解答.
大多回答#ifdef, 但这是compiler time决定.
看有没有神人遇过类似的需求.
感谢.
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 113.196.154.3
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1476169406.A.5E5.html
1F:推 Clangpp: #ifdef 就好了啊 10/11 15:21
现在code就是用#ifdef去吃.
但Run Time执行时, Project1/Project2 就要分二只档案跑了.
2F:推 nowar100: 可以考虑用 env var 或是 config 档案 10/11 15:24
谢谢, 正在研究中.
3F:推 shadow0326: 编两只程式 再写一个tool runtime决定要呼叫哪个程式 10/11 15:28
呼叫外部程式没实作过....
或许是条路啦XDD
感谢.
4F:推 james732: 如果都是这种ID类的资料,或许可以建个表格 10/11 15:48
5F:→ james732: runtime选择就代表compile的时候两份资料都要编译进去 10/11 15:48
表格化是我想的另一条路.
这几个Header file都上万行. 但格式固定.
可以给Editor去处理.
只是现在code 在Project1已经大量引用Project1.h的define.
但表格化要处理一次#define.
一整个没头绪.
6F:→ CP64: 这种就 runtime 从外部读 要不然就把会动到的地方切开各自编 10/11 15:54
7F:→ CP64: 如果就固定不便的话就可以像楼上那样全编 执行时再传参数 10/11 15:55
8F:→ CP64: 变 10/11 15:56
有想过fprintf从外面读.
但同上回答, 现在整个头大.
9F:推 chchwy: include就是编译期的行为 怎麽可能runtime改呢 10/11 15:56
10F:→ chchwy: 一定是用某些work around去做 10/11 15:56
我就是想了好几天都无解...
11F:→ Schottky: 建表倒不是问题,现在的问题是两个 .h 定义一样的symbol 10/11 16:06
12F:→ Schottky: 要求另外两个部门改名是政治问题了 10/11 16:07
13F:→ Schottky: 所以 compile 两支程式是最省力不用碰政治的作法... 10/11 16:08
14F:→ Schottky: 此外我还担心暗藏其他问题,比如同名不同实作的function 10/11 16:10
Bingo!!
不过还好这问题都是出在同Function.
因为Spec开的不同, 所以这同名搬家问题会跟着Project跑.
新人时没想过这问题. 现在新的Project来了真的要搞死我了.
compiler time build 二个tool怕有个问题.
就是user不知道那个Project对那个tool.
势必得先做个先导的tool..
call外部程式又没做过.
再google 看看吧.
15F:推 ronin728: 在程式里面塞个 Tiny C Compiler 不知道有没有用 XD 10/11 19:41
google一下没答案.
可能方向错了~
不过感谢.
16F:推 firejox: 这感觉用dynamic load可解决 10/11 20:08
google过了, 试了一下好像还是不行.
感谢.
17F:推 CoNsTaR: 你有 a、b 两个语境要切换,那就 include 另一个 header 10/11 20:51
18F:→ CoNsTaR: ,这个 header 负责 extern 所有变数,然後把原来的两个 10/11 20:51
19F:→ CoNsTaR: header #define 改成变数,然後编成两个 dll,执行的时 10/11 20:51
20F:→ CoNsTaR: 候再选择动态连结那个就好 10/11 20:51
这个好像有点难, 我还没理解怎麽做.
最近这个Project被Pending住, 回头再看这麽做.
21F:推 steve1012: 为啥不用exec配两个编译好的就好 10/11 21:31
这个意思不太懂.
是指compiler二只来做吗?
是怕User端会有版本的问题.
22F:→ final01: 不就在包一层... 10/11 23:55
包一层?
23F:推 soheadsome: 把c写得像oo 10/12 11:47
像oo?
24F:推 TeaEEE: 这种用namespace可能容易点吧 10/12 13:31
刚google一下namespace, 晚点试看看.
25F:→ descent: 他的环境是 dos 10/12 14:01
26F:推 EdisonX: 太屌了.没注意到是 dos 环境.可以知道是什麽 compiler吗? 10/16 00:15
Watcom C
27F:→ Caesar08: dos!????? 10/17 00:07
我的测试是很硬体底层的东西, DOS管制比较少, 会比较方便.
※ 编辑: viajimmy (113.196.154.3), 10/19/2016 11:14:41