incrementing an integer at compile time, across source files

S

Sean Dettrick

I am wondering if it is possible to increment an integer at compile
time using template<int N> (or by any other method, e.g. compiler
directives etc), across multiple source files.

This may sound crazy, but I wish to build a string array (which
requires no user maintenance) of source file RCS version numbers!
The idea is, I would like to be print the beggers out or operate on
them at run time if I feel like it, by using a (maintenance free) loop.
By maintenance free, I mean that in each source file I would like to
be able to refer to some integer, say RCS::N, which is automatically
different in every source file, without the user having to specify
it (except for an initial value).

i.e. I would like to be able to have a set of files like this:

// rcs.h:
#include <string>
namespace RCS{
const int Nfiles_max=20; // max number of source files
string[Nfiles_max] Version; // to hold RCS version numbers of source files
int N;

template<int N> some_handy_way_to_increment_N_at_compile_time{};
};

// fileA.cpp:
// if fileA.cpp is compiled first, want RCS::N to have the value 0.
#include "rcs.h"
RCS::Version[RCS::N] = "$Revision$"
/* ... stuff ... */

// fileB.cpp:
// if fileB.cpp is compiled second, want RCS::N to have the value 1.
#include "rcs.h"
RCS::Version[RCS::N] = "$Revision$"
/* ... different stuff ... */

// fileC.cpp:
// if fileC.cpp is compiled third, want RCS::N to have the value 2.
#include "rcs.h"
RCS::Version[RCS::N] = "$Revision$"
int main(){

for (int i=0; i<RCS::Nfiles_max; i++ ) cout << RCS::Version << endl;

if ( RCS::Version[0] != RCS::Version[1] ) cout << "version mismatch!" << endl;

}


Any ideas on this?
I presume it is impossible, but hope to be pleasantly surprised.

Thanks in advance,
Sean Dettrick
 
A

Alf P. Steinbach

I am wondering if it is possible to increment an integer at compile
time using template<int N> (or by any other method, e.g. compiler
directives etc), across multiple source files.

This may sound crazy, but I wish to build a string array (which
requires no user maintenance) of source file RCS version numbers!
The idea is, I would like to be print the beggers out or operate on
them at run time if I feel like it, by using a (maintenance free) loop.
By maintenance free, I mean that in each source file I would like to
be able to refer to some integer, say RCS::N, which is automatically
different in every source file, without the user having to specify
it (except for an initial value).

i.e. I would like to be able to have a set of files like this:

// rcs.h:
#include <string>
namespace RCS{
const int Nfiles_max=20; // max number of source files
string[Nfiles_max] Version; // to hold RCS version numbers of source files
int N;

template<int N> some_handy_way_to_increment_N_at_compile_time{};
};

// fileA.cpp:
// if fileA.cpp is compiled first, want RCS::N to have the value 0.
#include "rcs.h"
RCS::Version[RCS::N] = "$Revision$"
/* ... stuff ... */

// fileB.cpp:
// if fileB.cpp is compiled second, want RCS::N to have the value 1.
#include "rcs.h"
RCS::Version[RCS::N] = "$Revision$"
/* ... different stuff ... */

// fileC.cpp:
// if fileC.cpp is compiled third, want RCS::N to have the value 2.
#include "rcs.h"
RCS::Version[RCS::N] = "$Revision$"
int main(){

for (int i=0; i<RCS::Nfiles_max; i++ ) cout << RCS::Version << endl;

if ( RCS::Version[0] != RCS::Version[1] ) cout << "version mismatch!" << endl;

}


Any ideas on this?
I presume it is impossible, but hope to be pleasantly surprised.


It's not impossible, but very labor-intensive: you have to write your
own compiler, unless you can find one that supports what you think you
need (a typical compiler retains no memory from one compilation to
the next).

What you think you need is not what you need.

Also, the assumption of identical revision numbers for compatible
source files is probably unfounded.

<ot>
One solution to what appears to be the real problem is to use a source
control system + agreed on rules for checking in and checking out.
</ot>
 
D

Dave Rahardja

<ot>
One solution to what appears to be the real problem is to use a source
control system + agreed on rules for checking in and checking out.
</ot>

Agreed, this seems to be a problem best solved by your version control system.
Try reading up on automatically-expanded version contral tags that you can
embed in your source code (such as $Revision$, etc.) to see if they suit your
needs.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,020
Latest member
GenesisGai

Latest Threads

Top