Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Will using a preprocessor directive to define what a dollar sign represents cause any conflicts?

Can I use the following in C++?:

#define $ cout

int main(){
    $<<"Hello World!\n";
    return 0;
}

I'm wondering whether it will cause any conflicts.

like image 989
Somnium Avatar asked Feb 19 '14 15:02

Somnium


People also ask

What is the purpose of preprocessor directive?

Preprocessor directives, such as #define and #ifdef , are typically used to make source programs easy to change and easy to compile in different execution environments. Directives in the source file tell the preprocessor to take specific actions.

Which symbol is used for preprocessor directive?

All Preprocessor directives begin with the # (hash) symbol. C++ compilers use the same C preprocessor. The preprocessor is a part of the compiler which performs preliminary operations (conditionally compiling code, including files etc...) to your code before the compiler sees it.

What are preprocessor directives explain any two with examples?

Examples of some preprocessor directives are: #include, #define, #ifndef etc. Remember that the # symbol only provides a path to the preprocessor, and a command such as include is processed by the preprocessor program. For example, #include will include extra code in your program.

What is define preprocessor directives in C?

It is a pre-process of execution of a program using c/c++ language. To initialize a process of preprocessor commands, it's mandated to define with a hash symbol (#). It can preferably be the non-blank character, and for better readability, a preprocessor directive should start in the first column.


2 Answers

It's not definitively legal, but your implementation is allowed to accept it.

Consider:

[C++11: 2.5/1]: Each preprocessing token that is converted to a token (2.7) shall have the lexical form of a keyword, an identifier, a literal, an operator, or a punctuator.

Here, your $ is obviously not a keyword, operator or punctuator (as these are enumerated in the standard), and it doesn't look like a literal, so it could only be an identifier; now, identifiers must contain only alphanumerics and underscores, and digits cannot be leading (based on the grammar denoted under [C++11: 2.11]).

However, the standard does also allow implementations to accept other characters, so what you want to do may work, but it will not be portable.

like image 157
Lightness Races in Orbit Avatar answered Sep 24 '22 15:09

Lightness Races in Orbit


This is implementation defined behavior. $ is not included in grammar for an identifiers the rules for identifier names in C++ are:

  1. It can not start with a number
  2. Can be composed of letters, numbers, underscore, universal character names and implementation defined characters
  3. Can not be a keyword.

But it does allow for implementation-defined characters which many compilers support as an extension, including gcc and Visual Studio.

The actual grammar is covered in the draft C++ standard section 2.11 Indentifier:

identifier:
  identifier-nondigit            <- Can only start with a non-digit
  identifier identifier-nondigit <- Next two rules allows for subsequent 
  identifier digit               <-  characters to be those outlined in 2 above
identifier-nondigit:
  nondigit                       <- a-z, A-Z and _ 
  universal-character-name
  other implementation-defined characters
[...]

We can see this applies to define from section 16 Preprocessing directives. We can see from the grammar that it must be an identifier:

# define identifier replacement-list new-line
# define identifier lparen identifier-listopt) replacement-list new-line
# define identifier lparen ... ) replacement-list new-line
# define identifier lparen identifier-list, ... ) replacement-list new-line
         ^^^^^^^^^^
like image 22
Shafik Yaghmour Avatar answered Sep 22 '22 15:09

Shafik Yaghmour