## 12 CIL Limitations

There are several implementation details of CIL that might make it unusable or less than ideal for certain tasks:

- CIL operates after preprocessing. If you need to see comments, for example, you cannot use CIL. But you can use attributes and pragmas instead. And there is some support to help you patch the include files before they are seen by the preprocessor. For example, this is how we turn some `#define`s that we don't like into function calls.
- CIL does transform the code in a non-trivial way. This is done in order to make most analyses easier. But if you want to see the code `e1, e2++` exactly as it appears in the code, then you should not use CIL.
- CIL removes all local scopes and moves all variables to function scope. It also separates a declaration with an initializer into a declaration plus an assignment. The unfortunate effect of this transformation is that local variables cannot have the `const` qualifier.