| **Navigation:**  [[introduction.htm|Language Reference]] > 5 - Declaration Attributes > Variable and Entity Attributes >====== NAME (set external name) ====== | [[module specify class member source file .htm|{{btn_prev_n.gif|Previous page}}]][[introduction.htm|{{btn_home_n.gif|Return to chapter overview}}]][[nocase case insensitive key or index .htm|{{btn_next_n.gif|Next page}}]] | | || **NAME(** [//name//] **)** {{blk2blue.jpg|blk2blue.jpg}} | **NAME** | Specifies an external name. | | //name// | A string constant containing the external name or the label of a static string variable. This may be declared as Global data, Module data, or Local data with the STATIC attribute.The NAME attribute can be any ANSI or Unicode string. | The **NAME** attribute (PROP:NAME) specifies an external name. The NAME attribute is completely independent of the EXTERNAL attribute--there is no required connection between the two, although both attributes may be used on the same declaration. The NAME attribute may be placed on a PROCEDURE Prototype, FILE, KEY, INDEX, MEMO, any field declared within a FILE, any field declared within a QUEUE structure, or any variable not declared within a structure. The NAME attribute has different implications depending on where it is used. **PROCEDURE Prototype Usage** NAME may be specified on a PROCEDURE Prototype. The //name// supplies the external name used by the linker to identify the procedure or function from an external library. **Variable Usage** NAME may be used on any variable declared outside of any structure. This provides the linker with an external name to identify a variable declared in an external library. If the variable also has the EXTERNAL attribute, it is declared, and its memory is allocated, as a public variable in the external library. Without the EXTERNAL attribute, it is declared, and its memory is allocated, in the Clarion program, and it is declared as an external variable in the external library. **FILE Usage** On a FILE statement, NAME specifies the filename of the data file for the file driver. If the //name// does not contain a drive and path, the current drive and directory are assumed. If the extension is omitted, the directory entry assumes the file driver's default value. Some file drivers require that KEYs, INDEXes, or MEMOs be in separate files. Therefore, a NAME may also be placed on a KEY, INDEX, or MEMO declaration. A NAME attribute without a //name// parameter defaults to the label of the declaration statement on which it is placed (including any specified prefix). NAME may be used on any field declared within a RECORD structure (the //name// parameter must be a constant, in this case). This provides the file driver with the name of a field as it may be used in that driver's file system. You can dynamically change the name of a field within a FILE using PROP:NAME as an array. The array element number references the ordinal position of the field within the FILE. The NAME attribute is considered a part of the file structure, and care should be taken not to have threaded variables used by NAME referenced by non-threaded files. For example: FileName STRING(255) TFileName STRING(255),THREAD File FILE,NAME(TFileName)                        !Wrong File FILE,NAME(FileName)                          !Valid File FILE,NAME(TFileName),THREAD           !Valid File FILE,NAME(FileName),THREAD                  !Valid **QUEUE Usage** The NAME attribute on a variable declared in a QUEUE structure specifies an external //name// for queue processing. The //name// provides an alternate method of addressing the variables in the QUEUE which may be used by the SORT, GET, PUT, and ADD statements. **Example:** PROGRAM MAP MODULE('External.Obj') AddCount PROCEDURE(LONG),LONG,C,NAME('_AddCount')   !C function named '_AddCount' END END Cust  FILE,DRIVER('Topspeed')PRE(Cus),NAME(CustName)!Filename in CustName variable CustKey  KEY('Name'),NAME('c:\data\cust.idx')       !Declare key, cust.idx Record   RECORD Name      STRING(20)                                !Default NAME to 'Cus:Name' END END SortQue QUEUE Field1   STRING(10),NAME('FirstField')              !QUEUE SORT NAME Field2   LONG,NAME('SecondField')                   !QUEUE SORT NAME END CurrentCnt LONG,EXTERNAL,NAME('Cur')               !Field declared public in external library as 'Cur' TotalCnt  LONG,NAME('Tot')                                        !Field declared external in external library as 'Tot' CODE OPEN(Cust) Cust{PROP:NAME,1} = 'Fred'                         !Cus:Name field now referenced as 'Fred' **See Also:** [[procedure prototypes.htm|PROCEDURE Prototypes]] [[queue declare a memory queue structure .htm|QUEUE]] [[sort sort queue entries .htm|SORT]] [[get read a record or entry .htm|GET]] [[put re write record .htm|PUT]] [[add add an entry .htm|ADD]] [[file declare a data file structure .htm|FILE]] [[key declare dynamic file access index .htm|KEY]] [[index declare static file access index .htm|INDEX]] [[external set defined externally .htm|EXTERNAL]]