Problem:
- Product Name: VisiBroker for C
- Product Version: 6.x
- Product Component: idl2cpp
- Platform/OS version: All
You have anapplication that is compiled and run smoothly in VisiBroker 6.5 for C . Aftermigrating to VisiBroker 7.0 for C , you have encountered following error:
constant value is not known
unsigned int m_value[IDX];
For example
bank.idl will generate bank_c.h, bank_c.cpp, bank_s.h and bank_s.cpp. The IDX will be declared in bank_c.h.
There is another file BigByte.h which will include the bank_c.h and use the IDX by “unsigned int m_value[IDX];".
The IDL is defined with “const long IDX;”. All the files are the same as before but the compiling is getting above problem.
In VisiBroker6.x and previous version, the idl2cpp will map a “const” variable into .h file.For example:
In .idl:
const long IDX=10;
interface Bank{
…
…
};
In bank_c.h, it will become:
extern const ::CORBA:Long IDX=10;
class bank {
…
…
}
But in VisiBroker 7.0, the code will become:
In bank_c.h:
extern const ::CORBA:Long IDX; //10
class bank {
…
…
}
In bank_c.cpp:
const ::CORBA::Long IDX=10;
class bank {
…
…
};
If BigByte.h include bank_c.h as before, bank_c.h only contains the declaration of IDX. The actual definitionis in bank_c.cpp. Therefore, when the compiler checks the line “unsignedint m_value[IDX];” in BigByte.h, the compiler will raise error: “unknown const value” or “expected constant expression”. The reason is because the definition is not contained in bank_c.h, but in bank_c.cpp.
In C , a const that is outside all functions has file scope (i.e., it is invisible outside the file). It defaults to internal linkage. It is very different from all other identifiers in C (and from const in C!) that default to external linkage.
Since a const in C defaults to internal linkage, you cannot just define a const in one file and reference it as an extern in another file. To give a const external linkage that can be referenced from another file, you must explicitly define it as extern. An example is shown below:
extern const long IDX = 10;
The behaviours of idl2cpp in VisiBroker 6.x and 7.0 are different. Thus, the const defined in bank_c.cpp cannot be used by other file, but only inside bank_c.cpp.
Resolution:
To solve the problem, CR4687 has been filed and fixed in VisiBroker 7.0 Service Pack 2. A new option is added to the idl2cpp compiler to generate the desired code for backward compatibility purposes. Please set "const_in_header" option with the idl2cpp compiler. It only works for global constant defined in IDL. The default for this option is off.
#idl2cpp
#Security
#C
#c
#IDL
#VisiBroker