I’m trying to compile a code that has several .h files and there are redefinitions in the .h files.
Does PGI 10.3 (C compiler) support #pragma once ?
pgcc -D_UMFPACK -DWINDOWS -D_PC_PG -lstdc++ -I…/include -I…/frict
PGC-S-0043-Redefinition of symbol, NSM_SEDIMENT_SORBING_ENUM (.\C.En
PGC-S-0043-Redefinition of symbol, NSM_PARTITIONABLE_ENUM (.\C.Enume
PGC-S-0043-Redefinition of symbol, NSM_SPECIES_ENUM (.\C.Enumeration
PGC/x86-64 Windows 10.3-0: compilation completed with severe errors
make[1]: *** […/lib/libadh.a(C.Q2.Channel.Cell.Kinetics.o)] Error 2
Thanks
Gaurav
Hi Gaurav,
Does PGI 10.3 (C compiler) support #pragma once ?
No sorry. You’ll need to add the standard pre-possessor guards.
Mat,
Thanks for the quick reply.
I added #ifndef pre-processor blocks and I no longer get the redifinition errors.
However (and I’m new to enums so, this might be wrong) I get the following error
PGC-S-0037-Syntax error: Recovery attempted by deleting keyword enum (.\C.App.h: 57)
PGC-S-0037-Syntax error: Recovery attempted by deleting keyword enum (.\C.Sediment.h: 57)
PGC-S-0037-Syntax error: Recovery attempted by deleting keyword enum (.\C.Enumerations.h: 57)
C.ENUMERATIONS.h is
#include “LINKAGE.h”
#ifndef
#define NSM_SEDIMENT_SORBING_ENUM
enum NSM_SEDIMENT_SORBING_ENUM
{
NSM_SEDIMENT_IS_SORBING_Enum,
NSM_SEDIMENT_IS_NOT_SORBING_Enum
};
#endif
#ifndef NSM_PARTITIONABLE_ENUM
#define NSM_PARTITIONABLE_ENUM
enum NSM_PARTITIONABLE_ENUM
{
NSM_IS_PARTITIONABLE_Enum, // Use if: Want partitioning between dissolved, bound and sediment-sorbed
NSM_IS_FULLY_DISSOLVED_Enum, // Use if: Want only dissolved form
NSM_IS_FULLY_SORBED_Enum // Use if: Want only sediment-sorbed form
};
#endif
#ifndef NSM_SPECIES_ENUM
#define NSM_SPECIES_ENUM
enum NSM_SPECIES_ENUM
{
NSM_NO2_Enum = 0,
NSM_NO3_Enum,
NSM_NH4_Enum,
NSM_ORGANIC_NITROGEN_Enum,
NSM_ORGANIC_PHOSPHORUS_Enum,
NSM_DISSOLVED_PHOSPHORUS_Enum,
NSM_ALGAE_Enum,
NSM_CBOD_Enum,
NSM_DISSOLVED_OXYGEN_Enum,
NSM_Soil_N_organicActive_Enum = 100,
NSM_Soil_N_organicStable_Enum,
NSM_Soil_P_organicActive_Enum,
NSM_Soil_P_organicStable_Enum,
NSM_Soil_P_mineralActive_Enum,
NSM_Soil_P_mineralStable_Enum,
};
#endif
// F U N C T I O N P R O T O T Y P E S
EXPORT int NSM_SPECIES_ENUM_IsChannelSpecie(enum NSM_SPECIES_ENUM specieEnum);
EXPORT int NSM_SPECIES_ENUM_IsOverlandSpecie(enum NSM_SPECIES_ENUM specieEnum);
EXPORT int NSM_SPECIES_ENUM_IsSoilSpecie(enum NSM_SPECIES_ENUM specieEnum);
EXPORT enum NSM_PARTITIONABLE_ENUM NSM_SPECIES_ENUM_IsPartitionable(enum NSM_SPECIES_ENUM specieEnum);
The last line is line 57.
Any help on why line 57 is causing errors will be appreciated.
Thanks
Gaurav
Looks like a typo where you missed adding NSM_SEDIMENT_SORBING_ENUM after the ifdef.
#ifndef NSM_SEDIMENT_SORBING_ENUM
#define NSM_SEDIMENT_SORBING_ENUM
enum NSM_SEDIMENT_SORBING_ENUM
{
Are you getting the redefinition errors because ENUMERATIONS.h is getting included multiple times? If so, then you probably can just put a guard around the whole file. Something like:
#ifndef ENUMERATIONS_H_DEFINE
#define ENUMERATIONS_H_DEFINE
#include "LINKAGE.h"
enum NSM_SEDIMENT_SORBING_ENUM
{
NSM_SEDIMENT_IS_SORBING_Enum,
NSM_SEDIMENT_IS_NOT_SORBING_Enum
};
enum NSM_PARTITIONABLE_ENUM
{
NSM_IS_PARTITIONABLE_Enum, // Use if: Want partitioning between dissolved, bound and sediment-sorbed
NSM_IS_FULLY_DISSOLVED_Enum, // Use if: Want only dissolved form
NSM_IS_FULLY_SORBED_Enum // Use if: Want only sediment-sorbed form
};
enum NSM_SPECIES_ENUM
{
NSM_NO2_Enum = 0,
NSM_NO3_Enum,
NSM_NH4_Enum,
NSM_ORGANIC_NITROGEN_Enum,
NSM_ORGANIC_PHOSPHORUS_Enum,
NSM_DISSOLVED_PHOSPHORUS_Enum,
NSM_ALGAE_Enum,
NSM_CBOD_Enum,
NSM_DISSOLVED_OXYGEN_Enum,
NSM_Soil_N_organicActive_Enum = 100,
NSM_Soil_N_organicStable_Enum,
NSM_Soil_P_organicActive_Enum,
NSM_Soil_P_organicStable_Enum,
NSM_Soil_P_mineralActive_Enum,
NSM_Soil_P_mineralStable_Enum,
};
// F U N C T I O N P R O T O T Y P E S
EXPORT int NSM_SPECIES_ENUM_IsChannelSpecie(enum NSM_SPECIES_ENUM specieEnum);
EXPORT int NSM_SPECIES_ENUM_IsOverlandSpecie(enum NSM_SPECIES_ENUM specieEnum);
EXPORT int NSM_SPECIES_ENUM_IsSoilSpecie(enum NSM_SPECIES_ENUM specieEnum);
EXPORT enum NSM_PARTITIONABLE_ENUM NSM_SPECIES_ENUM_IsPartitionable(enum NSM_SPECIES_ENUM specieEnum);
#endif /* ENUMERATIONS_H_DEFINE */