Developer forums (C::B DEVELOPMENT STRICTLY!) > CodeCompletion redesign
extern "C" not working with CC
daniloz:
Hi All,
I have some function in assembly (on a DSP project) and I use the following syntax to declare them in C++:
--- Code: ---extern "C" void foo_asm(...);
--- End code ---
However, the CC is not recognizing this declaration because of the ' "C" ' part... Here is a small example to reproduce this:
--- Code: ---extern "C" void foo_asm(void);
extern void foo_OK(void);
void main()
{
foo
}
--- End code ---
If you place the cursor after foo in main, you just get "foo_OK" as suggestion and foo_asm doesn't even appears in the symbol browser...
Any hints or workarounds ?
ollydbg:
it can be fix very easily. I have see someone complain this before.
But the question is: Is it necessary???
Because currently, extern statement was skipped by CC's parser.
daniloz:
--- Quote from: ollydbg on February 11, 2011, 02:05:01 pm ---it can be fix very easily. I have see someone complain this before.
--- End quote ---
That's good news!
--- Quote from: ollydbg on February 11, 2011, 02:05:01 pm ---But the question is: Is it necessary???
Because currently, extern statement was skipped by CC's parser.
--- End quote ---
I don't think this is the case, if you look at my example, foo_OK is processed by the CC and shown in the Symbol Browse AND as a completion suggestion.
In my case it would be VERY convenient to have these external processed because then I can get the argument list while typing... :-)
By the way, I'd be more than happy to do the patch on my system and try it, if you point me to the right direction... ;-)
ollydbg:
Oh, sorry, I just review the code in "parserthread.cpp"
--- Code: --- else if (token == ParserConsts::kw_extern)
{
// check for "C", "C++"
m_Str = m_Tokenizer.GetToken();
if (m_Str == ParserConsts::kw_C || m_Str == ParserConsts::kw_CPP)
{
m_Tokenizer.GetToken(); // "eat" {
DoParse(); // time for recursion ;)
}
else
{
// do nothing, just skip keyword "extern", otherwise uncomment:
//SkipToOneOfChars(ParserConsts::semicolon); // skip externs
m_Tokenizer.UngetToken();
}
m_Str.Clear();
}
--- End code ---
It seems you are right, the feature was not implemented. :D
It may be a bug, see the statement:
--- Code: ---m_Tokenizer.GetToken(); // "eat" {
--- End code ---
I think we need to check the Token is a "{" or not, am I right?
daniloz:
--- Quote from: ollydbg on February 11, 2011, 03:18:28 pm ---It seems you are right, the feature was not implemented. :D
--- End quote ---
That's great news, actually... :-D
--- Quote from: ollydbg on February 11, 2011, 03:18:28 pm ---It may be a bug, see the statement:
--- Code: ---m_Tokenizer.GetToken(); // "eat" {
--- End code ---
I think we need to check the Token is a "{" or not, am I right?
--- End quote ---
Yes, it can be a simple statement as in my example case... How do we do this check? (I am new to the CC code, sorry)
BTW, I changed by example to
--- Code: ---extern "C" {void foo_asm(void);}
extern void foo_OK(void);
void main()
{
foo
}
--- End code ---
And now I get the completion for both foo_OK and foo_asm. :-)
However, I'd still prefer to not to have to use {}s...
Navigation
[0] Message Index
[#] Next page
Go to full version